Java 休眠多对一更新外键为空

Java 休眠多对一更新外键为空,java,hibernate,one-to-many,many-to-one,Java,Hibernate,One To Many,Many To One,我正在努力使我的“一对一”和“多对一”关系正确 第1类: @Entity public class IdeaProfile { @Id @GeneratedValue private int ideaProfileId; private String name; Date dateConcieved; @OneToOne @JoinColumn(name="statusCode") private Status status; @OneToMany(fetch=FetchType

我正在努力使我的“一对一”和“多对一”关系正确

第1类:

@Entity
public class IdeaProfile {

@Id
@GeneratedValue
private int ideaProfileId;

private String name;

Date dateConcieved;

@OneToOne
@JoinColumn(name="statusCode")  
private Status status;


@OneToMany(fetch=FetchType.EAGER, targetEntity=Pitch.class, cascade=CascadeType.ALL)
@JoinColumn(name = "ideaProfileId") 
private List<Pitch> pitchs;

    ....getters and setters....
当我加载或保存新记录时,此关系似乎运行良好:

Hibernate: insert into IdeaProfile (dateConcieved, genreCode, name, statusCode) values (?, ?, ?, ?)
Hibernate: insert into Pitch (date, ideaProfileId, notes) values (?, ?, ?)
Hibernate: update Pitch set ideaProfileId=? where id=?
但是,当我尝试更新该记录时,它会尝试将IdeaProfileId设置为null:

Hibernate: update IdeaProfile set dateConcieved=?, genreCode=?, name=?, statusCode=?,  where ideaProfileId=?
Hibernate: update Pitch set date=?, ideaProfileId=?, notes=? where id=?
Hibernate: update Pitch set ideaProfileId=null where ideaProfileId=?
当我调试时,我可以看到IdeaProfileId确实设置在Pitch对象上

仅供参考,我没有直接更新从DB加载的原始对象。这些域被映射到一个模型类,该模型类是UI更新的。因此,在保存/更新时,我将值映射回新的域对象,包括如下ID:

IdeaProfile domain = new IdeaProfile();
domain.setId(model.getIdeaProfileId());
domain.setName(model.getName());
domain.setStatus(model.getStatus());
domain.setDateConcieved(Date.valueOf(model.getDateConvieved()));
for (PitchModel pitch : model.getPitches()) {
     Pitch pitchDomain = new Pitch();
     pitchDomain.setId(pitch.getId());
     pitchDomain.setDate(Date.valueOf(pitch.getDate()));
     pitchDomain.setNotes(pitch.getNotes());
     pitchDomain.setIdeaProfile(domain);
     if(domain.getPitchs() == null ) {
        domain.setPitchs(new ArrayList<Pitch>());
     }
     domain.getPitchs().add(pitchDomain);
 }

openSession();
session.beginTransaction();
session.saveOrUpdate(domain);
session.getTransaction().commit();
closeSession();
IdeaProfile域=新的IdeaProfile();
domain.setId(model.getIdeaProfileId());
domain.setName(model.getName());
domain.setStatus(model.getStatus());
domain.setdateconcived(Date.valueOf(model.getdateconvicved());
对于(PitchModel pitch:model.getPitchs()){
变桨域=新变桨();
pitchDomain.setId(pitch.getId());
pitchDomain.setDate(Date.valueOf(pitch.getDate());
pitchDomain.setNotes(pitch.getNotes());
pitchDomain.setIdeaProfile(域);
if(domain.getPitchs()==null){
domain.setPitchs(新的ArrayList());
}
domain.getPitchs().add(pitchDomain);
}
openSession();
session.beginTransaction();
session.saveOrUpdate(域);
session.getTransaction().commit();
closeSession();
有人知道我做错了什么,所以Hibernate导致更新尝试将IdeaProfileId设置为null吗


非常感谢。

您在这里没有双向关联。您有两个独立的关联,每个关联都错误地映射到同一列

在双向关联中,必须始终具有所有者端和反向端。反向侧使用mappedBy属性进行标记。在一对一关联中,反向侧必须是单侧:

@OneToMany(mappedBy="ideaProfile", fetch=FetchType.EAGER, cascade=CascadeType.ALL)
private List<Pitch> pitchs;

这里的问题是性能,如果您使用EAGER,那么如果有很多行,您应该研究表间距,但是如果只是一个值的dict,这不是一个坏的实践。
@OneToMany(mappedBy="ideaProfile", fetch=FetchType.EAGER, cascade=CascadeType.ALL)
private List<Pitch> pitchs;
@ManyToOne
@JoinColumn(name = "ideaProfileId")
private IdeaProfile ideaProfile;