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

But*_*rsB 3 java hibernate parent-child one-to-many

当我尝试将父类中的ID保存到子类时,我不断收到错误"错误 - 字段'parent_id'没有默认值"

我尝试了所有类型的映射.我正在使用注释.

任何有关这方面的帮助将不胜感激

家长:

      @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;
Run Code Online (Sandbox Code Playgroud)

儿童:

  @Id
  @Column(name="id")
  @GeneratedValue(strategy=GenerationType.AUTO)
  private long id;
  @Column(name="description")
  private String description;
Run Code Online (Sandbox Code Playgroud)

谢谢.

Hen*_*ing 16

如果有人遇到同样的问题,可以延迟添加.

这个实体在使用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<?>>();

 }
Run Code Online (Sandbox Code Playgroud)

insert语句event_id也没有设置列,也没有在事实之后更新插入的实体 - event_id保持为null并且关系丢失.

但是,如果@JoinColumn定义改变如下:

@JoinColumn(name = "event_id", nullable = false)
Run Code Online (Sandbox Code Playgroud)

,然后insert语句包括event_id它应该的列,一切都很好.

这可能只是这个特定版本的Hibernate的回归,但也许它可以帮助某人.

  • 我真的对这个问题感到头疼,并将`@JoinColumn(name ="event_id")`更改为`@JoinColumn(name ="event_id",nullable = false)`解决了这个问题. (4认同)

Rya*_*art 6

你必须在其他地方出错,因为这些映射将以它们的方式运行.他们可能会更好,但他们会工作.具体来说,所有@Column注释都是多余的和不必要的,并且作为非sequitor注意到,您应该使用JPA的级联属性@OneToMany而不是Hibernate @Cascade.我已经使用您发布的清理版本创建了一个可运行的示例.如果你有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
Run Code Online (Sandbox Code Playgroud)

它创建一个包含两个子节点的父节点,保存它们,然后加载它们并打印出图形.输出是:

Creating parent with two children
Loading saved parent
Parent{description='parent', children=[Child{description='child 2'}, Child{description='child 1'}]}
Run Code Online (Sandbox Code Playgroud)


sla*_*vik 6

在您的情况下,JPA提供程序持有子对象及其父对象在db上执行至少三次查询.前两个持久化对象.最后一个用外键引用父对象更新子对象.第二个查询失败,因为外键列上有NOT NULL约束.你有三个选择:

  1. 删除子实体中外键上的NOT NULL约束
  2. 使用双向关系
  3. 将JPA提供程序更改为支持此类情况的提供程序.