当我尝试将父类的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;
子:
@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;
@Column(name="description")
private String description;
感谢。
答案 0 :(得分:14)
如果有人遇到同样的问题,可以延迟添加。
此实体在使用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
保持为空并且关系丢失。
但是,如果@JoinColumn
定义改变如下:
@JoinColumn(name = "event_id", nullable = false)
,然后insert语句包含event_id
列,就像它应该的那样,一切都很好。
这可能只是这个特定版本的Hibernate的回归,但它可能对某人有帮助。
答案 1 :(得分:6)
你必须在其他地方出错,因为这些映射会按照它们的方式运行。他们可能会更好,但他们会工作。具体来说,所有@Column
注释都是多余的和不必要的,并且如果注意到非sequitor,您应该使用JPA的@OneToMany
的级联属性而不是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'}]}
答案 2 :(得分:6)
在您的情况下,JPA提供程序持有子对象及其父对象在db上执行至少三次查询。前两个持久化对象。最后一个 使用外键引用父级更新子对象。第二个查询失败,因为外键列上有NOT NULL约束。您有三种选择:
答案 3 :(得分:1)
将您的@OneToMany
更改为@OneToMany(cascade=CascadeType.ALL)
使用JPA而非Hibernate扩展
答案 4 :(得分:0)