首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring MVC Hibernate One to One Cascade.ALL merge()问题

Spring MVC Hibernate One to One Cascade.ALL merge()问题
EN

Stack Overflow用户
提问于 2015-05-20 05:17:42
回答 1查看 203关注 0票数 1

使用Spring MVC + Hibernate,我想对Employee实体执行CRUD操作。

employee实体与user实体具有一对一的关系,如下图所示:

我在更新员工信息时遇到问题。CREATEREADDELETE操作运行良好。

但是当我更新员工信息时,它从employee_user表中删除了记录,打破了员工和相应用户之间的关系。

我只有一个JSP页面来保存员工和用户信息。

JSP:

代码语言:javascript
复制
<form:form action="save" method="post" commandName="employee"">
    <div>
        <div>
            <label for="firstName">Name: </label>
            <form:input id="firstName" path="firstName" type="text" />
        </div>
        <div>
            <label for="email">Email: </label>
            <form:input id="email" path="email" type="text" />
        </div>
        <div>
            <label for="phone">Phone: </label>
            <form:input id="phone" path="phone" type="text" />
        </div>

        <div>
            <label for="usernmae">Username: </label>
            <form:input id="username" path="user.username" type="text" />
        </div>
        <div>
            <label for="password">Password: </label>
            <form:input id="password" path="user.password" type="text" />
        </div>
    </div>

    <form:input path="id" type="hidden" />
    <form:input path="user.id" type="hidden" />
    <input type="submit" name="save" value="Save" class="btn btn-primary" />
</form:form>

员工模型如下:

代码语言:javascript
复制
@Entity
@Table(name = "employee")
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column
    private String firstName;

    @Column
    private String email;

    @Column
    private String phone;

    @OneToOne
    @JoinTable(name = "employee_user", joinColumns = { @JoinColumn(name = "employee_id", referencedColumnName = "id") },
        inverseJoinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") })
    @Cascade({ org.hibernate.annotations.CascadeType.ALL })
    private User user;

    // getters and setters

}

USER模型是:

代码语言:javascript
复制
@Entity
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column
    private String username;

    @Column
    private String password;

    @OneToOne
    @JoinTable(name = "employee_user", joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") },
        inverseJoinColumns = { @JoinColumn(name = "employee_id", referencedColumnName = "id") })
    @Cascade({ org.hibernate.annotations.CascadeType.ALL })
    private Employee employee;

    // getters and setters

}

控制器部分如下所示。相同的方法同时处理创建和更新请求。

代码语言:javascript
复制
@RequestMapping(value = "/save", method = RequestMethod.POST)
public String saveEmployee(@ModelAttribute("employee") Employee employee,
        BindingResult result) {

    employeeService.save(employee);
    return "";
}

在这里,保存方法调用Hibernate的Session.merge(employee);方法。

谁能让我知道幕后的问题是什么?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2015-05-20 10:21:21

这个问题的原因是,您的ModelAttribute employee对象将被表单.So中的新值覆盖,对待用户对象为空.you可以通过id从数据库中搜索员工,然后从搜索到的员工.finally中设置用户,合并employee对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30336345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档