一对许多单向父母-孩子ID级保存
-
18-09-2019 - |
题
当试图保存一个ID从我父类进入一个子类,我越来越错误 "错误场'parent_id'没有一个默认值"
我已经尝试了所有类型的映射。我使用说明。
任何帮助在这个会理解的
Parent:
@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;
谢谢。
解决方案
您必须有什么不对别的地方,因为这些映射将工作会是这样的。他们可能会更好,但他们会工作。具体而言,所有的@Column
注释是多余的和不必要的,并且不sequitor指出,你应该使用JPA的@OneToMany
而不是Hibernate的@Cascade
的级联特性。我创建了一个运行的例子与你贴什么清理的版本。如果你有Git和行家,你可以运行它:
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,坚持的将的级联FieldChange
entities,但会的不的填写连接列:
@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<?>>();
}
同样没有插入语句设置event_id
列,也没有更新的事实后插入的实体 - 的event_id
保持零和关系都将丢失。
如果,然而,@JoinColumn
定义改变这样的:
@JoinColumn(name = "event_id", nullable = false)
,则插入语句包括像它应该,所有的event_id
列是很好。
这可能只是休眠的这个特定版本的回归,但也许它可以帮助别人。
在你的情况下访问用户的提供者持续对象的儿童与其父执行至少三个的查询数据库。第一个两持续的对象通过自己。最后一个 更新的孩子对象与外国的关键参考父母。第二个查询失败,因为你有一个不NULL约束在外国的关键柱。你有三个选项:
- 删除"NOT NULL"约束在外国的关键在儿童实体
- 使用双向的关系
- 改变访问用户提供一个支持这样的情况。
变更@OneToMany
到@OneToMany(cascade=CascadeType.ALL)
使用JPA而不是休眠扩展
我的猜测是,@JoinColumn annotation
需要分配一个referencedColumnName
。
@JoinColumn(name = "parent_id", referencedColumnName = "id")