当前位置: 首页 > 面试题库 >

Hibernate多对一将外键更新为空

钮出野
2023-03-14
问题内容

我正在尝试使我的@OneToMany和@ManyToOne关系正确。

第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....

第2类:

@Entity
public class Pitch {

@Id
@GeneratedValue
private int id;

@ManyToOne
@JoinColumn(name = "ideaProfileId")
private IdeaProfile ideaProfile;

private Date date;

private String notes;

 ....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确实在音高对象上设置了…

仅供参考,我不是直接更新从数据库加载的原始对象。这些域映射到UI更新的Model类。因此,在保存/更新时,我将值映射回新的域对象,包括如下所示的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();

有谁知道我做错了什么,所以Hibernate导致更新尝试将IdeaProfileId设置为null?

非常感激。


问题答案:

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

在双向关联中,必须始终具有所有者侧和反向侧。反面使用mappingBy属性标记。在OneToMany关联中,反面必须是一侧:

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

@ManyToOne
@JoinColumn(name = "ideaProfileId")
private IdeaProfile ideaProfile;


 类似资料:
  • 问题内容: 我正在尝试使我的@OneToMany和@ManyToOne关系正确。 第1类: 第2类: 当我加载或保存新记录时,这种关系似乎运行良好: 但是,当我尝试更新该记录时,它将尝试将IdeaProfileId设置为null: 当我调试时,我可以看到IdeaProfileId确实在音高对象上设置了… 仅供参考,我不是直接更新从数据库加载的原始对象。这些域映射到UI更新的Model类。因此,在保

  • 问题内容: 我有两个非常简单的对象,并且一个对象应在一组“一对多”关系中包含另一个对象。对象已正确插入数据库中,但“子项”表中的外键始终为“ null”。 我不知道为什么: 这是测试对象,它将子对象保持在其集合中: 这是子对象,它包含指向“ TestObj”的反向链接: 我使用以下代码来持久化此对象: 有人可以解释一下为什么会这样吗? 问题答案: 这很简单:您永远不会初始化中的字段(应将其命名为C

  • 下面是一对多关系的Hibernate示例 下一个项目java文件 iml代码 在这里,一辆车应该有很多项目,同时运行两个tanles都更新了,但是 第二张桌子 正如您所看到的,这两个表都已更新,但本例中的foreignkey carts\u id没有在owner类中更新,我使用了joincolumn

  • 我有一个一对多映射,它将用户(UserDetails)映射到车辆的ArrayList。我想知道是否可以覆盖默认的外键名,该外键名引用用户\u details\u vehicle中表vehicle(vehicleid)的id 我希望在结尾使用的create语句是: 这只是为了学习。

  • 我有两个类和,它们具有一对多关系。 假设我已经在我的数据库结构中持久化了,如下所示: ---编辑--- 实体不是什么花哨的东西,比如:

  • 我有两张桌子: null null null null 我不知道现在该做什么(一些脚本?)。我需要将表列中的值更改为表列中的相应值。 如果太混乱,我会试着举一个正常数据的例子: 表1中的行(oldprimarykey、sometext、newprimarykey): null null