Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一对多单向父子ID级联保存_Java_Hibernate_Parent Child_One To Many - Fatal编程技术网

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

Java 一对多单向父子ID级联保存,java,hibernate,parent-child,one-to-many,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 Stri

当试图将父类中的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;
谢谢。

将您的@OneToMany更改为@OneToManycascade=CascadeType。所有人都使用JPA而不是Hibernate扩展。

我猜@JoinColumn注释需要指定一个referencedColumnName

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

您一定在其他地方出了什么问题,因为这些映射将按原来的方式工作。他们可以做得更好,但他们会成功的。具体地说,所有@Column注释都是冗余和不必要的,正如non-sequitor所指出的,您应该使用JPA的@OneToMany的cascade属性,而不是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
它创建一个包含两个子项的父项,保存它们,然后加载它们并打印出图形。输出为:

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

如果有人遇到同一问题,则会延迟添加

此实体在使用Hibernate 4.1.8持久化时,将级联FieldChangeentities,但不会填充联接列:

@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列,一切正常


这可能只是这个特定版本的Hibernate中的一个回归,但可能会对某些人有所帮助。

在您的例子中,JPA提供程序将子对象与其父对象持久化在数据库上至少执行三次查询。前两个由对象自身持久化对象。最后一个 使用引用父对象的外键更新子对象。第二个查询失败,因为外键列上有NOTNULL约束。您有三种选择:

移除子实体中外键的NOTNULL约束 使用双向关系 将JPA提供程序更改为支持此类情况的提供程序。
当试图将父类中的ID保存到子类中时,您的意思是什么。你能详细说明一下吗?虽然这肯定是一个有效的建议,但这并不能完全回答OP的问题。绝对正确CHSSLY76我认为他在这里使用扩展是没有根据的,因为父id没有被正确传播。除了我建议的更改之外,他的注释看起来都是正确的。在缺少OP信息的情况下,您认为会发生什么?在创建引用主键的外键的典型情况下,不需要referencedColumnName。从文档中:默认值仅适用于使用单个联接列的情况:与引用表的主键列同名。选项1使用EclipseLink 2.5.1为我解决了此问题,谢谢!我真的对这个问题摸不着头脑,将@JoinColumnname=event\u id更改为@JoinColumnname=event\u id,nullable=false解决了这个问题。
@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<?>>();

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