hibernate 一对多单向父子ID级联保存

vx6bjr1n  于 2023-10-23  发布在  其他
关注(0)|答案(6)|浏览(137)

当试图将父类中的ID保存到子类中时,我不断收到错误“ERROR - Field 'parent_id' doesn 't have a default value”。
我尝试了所有类型的Map。我在使用注解。
任何关于这方面的帮助将不胜感激
父项:

@Id
      @Column(name="id")
      @GeneratedValue(strategy=GenerationType.AUTO)
      private long id;
      @Column(name="description")
      private String description;
      @OneToMany
      @Cascade(value= {org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE})
      @JoinColumn(name="parent_id")
      private List<Child> children;

孩子:

@Id
  @Column(name="id")
  @GeneratedValue(strategy=GenerationType.AUTO)
  private long id;
  @Column(name="description")
  private String description;

谢谢.

fbcarpbf

fbcarpbf1#

一个晚添加的情况下,任何人都遇到了同样的问题。
这里的这个实体,当使用Hibernate 4.1.8持久化时,* 将 * 级联FieldChange实体,但 * 不会 * 填充连接列:

@Entity
public class Event {

    //ID and other fields here

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "event_id")
    private List<FieldChange<?>> fields = new ArrayList<FieldChange<?>>();

 }

insert语句既不设置event_id列,也不更新插入的实体--event_id保持为null,关系丢失。
但是,如果@JoinColumn定义像这样更改:

@JoinColumn(name = "event_id", nullable = false)

,那么insert语句就像它应该的那样包括event_id列,一切都很好。
这可能只是这个特定版本的Hibernate的一个回归,但也许它对某些人有帮助。

axr492tv

axr492tv2#

在您的例子中,JPA提供程序将子对象与其父对象保持在一起,在db上执行至少三个查询。前两个持久化对象本身。最后一个更新子对象,其外键引用父对象。第二个查询失败,因为外键列上有NOT NULL约束。你有三个选择:
1.删除子实体中外键的NOT NULL约束
1.使用双向关系
1.将JPA提供程序更改为支持此类情况的提供程序。

mepcadol

mepcadol3#

你一定是在其他地方出了什么问题,因为这些Map将按照它们的方式工作。他们可以做得更好,但他们会工作。具体来说,所有的@Column注解都是多余的,不必要的,正如non sequitor所指出的,您应该使用JPA的@OneToMany的cascade属性,而不是Hibernate的@Cascade。我已经创建了一个runnable example与你张贴的清理版本。如果你有git和maven,你可以运行它:

git clone git://github.com/zzantozz/testbed tmp
cd tmp
mvn -q compile exec:java \
    -Dexec.mainClass=rds.hibernate.UnidirectionalManyToOneJoinColumn \
    -pl hibernate-unidirectional-one-to-many-with-join-column

它会创建一个带有两个子对象的父对象,保存它们,然后加载它们并打印出图形。输出为:

Creating parent with two children
Loading saved parent
Parent{description='parent', children=[Child{description='child 2'}, Child{description='child 1'}]}
sbtkgmzw

sbtkgmzw4#

@OneToMany更改为@OneToMany(cascade=CascadeType.ALL)使用JPA而不是Hibernate扩展

dw1jzc5e

dw1jzc5e5#

我的猜测是@JoinColumn annotation需要分配一个referencedColumnName

@JoinColumn(name = "parent_id", referencedColumnName = "id")
aij0ehis

aij0ehis6#

对于单向Map
您的子表应该有1列的外键(parent_id)。
在子实体中增加1个字段,保存前设置parent_id,如下所示。

class Child {
 
  //other fields

   @Column(name = "Id")
    private int parentId;
}

然后保存父对象

Parent createdParent = parentRepository.save(parent);

返回createdParent包含自动生成的 Parent ID 用于设置Child实体中parentId字段的上方。就像下面。

child.setParentId(createdParent.getId());

然后保存子实体,如。

childRepository.save(child);

相关问题