【发布时间】:2011-11-21 09:44:27
【问题描述】:
在我的 JPA/独立项目中使用 CascadeType.Persist 时遇到问题。我有一个父实体,它有一个子实体列表,应该与父实体一起保留,父实体的主键是使用表(GeneratorType.TABLE)生成的,我使用一个表来生成主键。
在父母中我有:
@OneToMany(mappedBy="parent",fetch=FetchType.EAGER,cascade= {CascadeType.PERSIST,CascadeType.DETACH})
List<Child> children;
//Getter and Setter
@PostPersist
public void setParentID(){
System.out.println("Inside Postpersist");
for(Child ch : this.children){
ch.setParent(this);
System.out.println(ch.getParent().getParentId());
}
}
在儿童中:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "Parent_ID")
private Parent parent;
在数据库中,我为 Parent 表的 Parent_ID 列设置了一个非空值。当我坚持一个父实体并且它已经设置了子实体列表时,它会抛出一个
ConstraintViolationException: Cannot insert the value NULL into column 'Parent_ID', table 'jpaTest.Child', column does not allow nulls.
因为父实体对于所有子实体都是空的,尽管它会将 ParentId 设置为使用@PostPersist 注释的方法中的每个子实体
但是,当我将主键生成策略从 TABLE 类型更改为 AUTO 时,不会发生这种情况,并且会发生父母和孩子的持久性。这是如何以及为什么会发生的。
提供者是 Hibernate。我的数据库服务器是 mssql。
【问题讨论】:
标签: jpa