当前位置: 首页 > 知识库问答 >
问题:

使用Spring和JSPHibernateOneToOne

谢高峯
2023-03-14

我有一个问题要问:

我必须表用户和user_login加入OneToOneuser.id-

问题是我什么时候做。updateObject(用户)我执行了2个查询:

Hibernate:在用户(创建、修改、电子邮件、名字、姓氏)中插入值(?,,,?,?)Hibernate:在用户登录(创建、修改、密码、用户id)中插入值(?,,?)[2012-08-15 12:15:04192][ERROR][http-bio-8080-exec-1]SqlExceptionHelper[144]:列“user\u id”不能为null

看起来两个对象之间没有引用。如果进入实体用户,方法setUserLogin我添加行userLogin.set用户(这个);它的工作,但我不觉得这种方式优雅老实说。在实体配置中,有没有什么我错过的东西可能不会自动完成?

非常感谢。

这里是我的实体

@Entity
@NamedQueries({ @NamedQuery(name = "user.list", query = "select u from User u") })
public class User implements java.io.Serializable {

    @Column(name = "first_name", nullable = true)
    private String firstName;   

    @OneToOne(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name="user_id", nullable=false)
    private UserLogin userLogin;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }


    public UserLogin getUserLogin() {
        return userLogin;
    }

    public void setUserLogin(UserLogin userLogin) {
        this.userLogin = userLogin;
        //userLogin.setUser(this); THIS IS THE LINE THAT FIXES IT, BUT I DONT FIND THIS WAY ELEGANT
    }

}


@Entity
@Table(name="user_login")
public class UserLogin implements java.io.Serializable {

    @Column(name = "password", nullable = false)
    private String password;


    @OneToOne(optional = false, fetch = FetchType.LAZY) 
  private User user;


    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }   

}

JSP文件:

<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<html>
<head>
<title>Registration Page</title>
</head>
<body>
    <form:form action="/test" commandName="user">
        <tr>
            <td>User Name :</td>
            <td><form:input path="firstName" /></td>
        </tr>
        <tr>
            <td>Password :</td>
            <td><form:input path="userLogin.password" /></td>
        </tr>
        <tr>
            <td colspan="2"><input type="submit" value="Register"></td>
        </tr>
        </table>
    </form:form>
</body>
</html>

Spring控制器:

@Controller(value = "/")
public class Test { 

  @Autowired
    UserServiceImpl userServiceImpl;

  @RequestMapping(method = RequestMethod.GET, value = "/test")
  public void test(ModelMap model) {

    model.addAttribute("user", new User());

  }

  @RequestMapping(method = RequestMethod.POST, value = "/test")
  public void test(User user) {

    userServiceImpl.update(user);    

  }
} 

共有1个答案

任云瀚
2023-03-14

像往常一样,双向关系确实有其拥有方。关系的拥有方是mappedBy引用的属性。在您的案例中,UserLogin中的属性user实体是拥有方。

当关系持久化到数据库时,只咨询拥有方。这意味着,您必须为user属性设置值,以便能够持久化。为了保持内存中实体图的一致性,应该设置关系的两边。

在JPA 2.0规范中,这是通过以下文字来说明的:

托管实体之间的双向关系将基于关系拥有方持有的引用而持久化。开发人员有责任在拥有侧和反面保持内存中引用的变化时保持它们彼此一致。

 类似资料:
  • 我正在学习Spring Boot,并试图实现身份验证。我有一个注册页面,它使用POST方法发送新用户数据以存储在内存数据库中。奇怪的是,当我提交表单时,GET方法是唯一被调用的方法。这是我的超文本标记语言文件: 如您所见,表单上有< code>method="POST"属性。 这是我的注册控制器: 我已经将放在@GetMap()方法中,即使我点击注册表单上的提交按钮,也可以在我的服务器上看到该方法

  • 我试图在Spring Boot微服务中使用Spring Cloud的特性(例如:Faign或Zipkin客户端)。每当我在pom中引入Spring云依赖时。xml I在启动时出现以下错误: 以下是导致此问题的示例pom.xml。我目前使用Spring Boot 2.0.0。RELEASE和Spring Cloud Finchley。M8。 我做错了什么?我应该切换到另一个版本的Spring Clo

  • 所以我有一个技术挑战我需要帮助。 一个大型项目正在使用Quartz调度程序调度一个作业,使其在每晚9点运行。 然而,调度的作业需要从属性文件中读取值,使用自动布线获取一些bean等。 当我使用@autowired和@value注释时,我发现这些值为空。 问题是Quartz在spring容器外部使用创建JobDetail对象。可以在下面的代码中看到。 因此,包装的对象无法使用Spring访问属性文件

  • 问题内容: 我有一个代码: 我期望一旦启动应用程序BeanSample.getSomeBean(),然后SomeBean将开始由“ someBean”提供。 现在我有一个错误: 没有定义名为“ someBean”的bean 实际上,我有点不明白应该使用哪个应用程序上下文来提取我的豆子? 关于@Configuration : 有什么原因,为什么我应该在这里使用@Configuration注释?(通过

  • 本文向大家介绍Spring Boot使用和配置Druid,包括了Spring Boot使用和配置Druid的使用技巧和注意事项,需要的朋友参考一下 1、引入依赖包 2、配置application.properties 3、目前Spring Boot中默认支持的连接池有dbcp,dbcp2, tomcat, hikari三种连接池。 由于Druid暂时不在Spring Bootz中的直接支持,故需要

  • 本文向大家介绍Spring Boot和Hazelcast使用详解,包括了Spring Boot和Hazelcast使用详解的使用技巧和注意事项,需要的朋友参考一下 你是否遇到过应用程序性能下降的问题?有没有想过提升Spring性能?如果是这样 - 那么这篇文章绝对适合你。在这里,我们将谈论使用超级强大和领先的内存数据网格提高应用程序的性能! 什么是Hazelcast? Hazelcast是一个内存