Hibernate更新一对一创建新的子对象,而不是更新现有的子对象

时间:2017-02-21 11:48:57

标签: java spring hibernate jpa orm

在我的spring mvc app中,我在数据库中有医生和用户表。每个医生都有一个用户。问题是当我尝试更新医生时,属于医生的用户没有更新。而不是这个,我在我的数据库中看到属于更新的医生的新用户。

这是我的Doctor.java实体:

@Entity
@Table(name="doctor")
public class Doctor {

    @Id
    @Column(name="id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;


    @Column(name="name")
    private String name;


    @Column(name="tel")
    private String tel;

    @Column(name="email")
    @Email
    private String email;

    private transient String ConfirmPassword;

    @OneToOne(fetch = FetchType.EAGER,  cascade = CascadeType.ALL)
    @JoinColumn(name = "user_id")
    private User user;

    //getter and setters....

这是我的User.java实体

@Entity
@Table(name="user")
public class User {

    @Id
    @Column(name="id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;


    @Column(name="username")
    private String username;


    @Column(name="password")
    private String password;


    //getters and setters...
}

这是我的表格:

<form:form action="save" modelAttribute="doctor" method="post">

        <form:errors path="name"></form:errors>
        <form:input path="name" placeholder="Doktor İsmi" class="form-control" />

        <form:input path="user.username" placeholder="Kullanıcı Adı" class="form-control" />

        <form:input type="email" path="email" placeholder="Email" class="form-control" />

        <form:input path="tel" placeholder="Telefon" class="form-control" />

        <form:input type="password" path="user.password" placeholder="Şifre" class="form-control" />

        <form:hidden path="id" />/>
        <input type="submit" value="Doktor Kaydet" />
    </form:form>

这是控制器保存方法:

@PostMapping(value="/save")
    public String save(@Valid Doctor dr, @Valid User usr, BindingResult bindingResult){

        doctorValidator.validate(dr, bindingResult);
        if (bindingResult.hasErrors()) {
            return "admin/doctor-form";
        }
        else{
            dr.getUser().setIs_doctor(1);
            doctorService.save(dr);
            return "redirect:list";
        }
    }

最后这里是DoctorDAO。保存方法,我没有为用户提供额外的保存操作,因为它应该通过医生保存。

public void save(Doctor dr) {
        Session s = sessionFactory.getCurrentSession();
        s.saveOrUpdate("doctor", dr);

    }

我试过阅读参考文献,我已经阅读过例子等等。我是Hibernate和JEE平台的初学者。我在两天内找不到解决方案。

感谢,,

1 个答案:

答案 0 :(得分:1)

我会这样做:

public void save(Doctor dr) {
    Session s = sessionFactory.getCurrentSession();
    Doctor managedDr = s.merge(dr);
    managedDr.getUser().setIs_doctor(1);
    s.saveOrUpdate("doctor", managedDr);

}

现在,在合并期间,将提取用户实体,当您执行saveOrUpdate时,它应该更新用户而不是插入,因为id将在那里。