Java Hibernate单向OneToMany delete违反约束(可选=父端为false?)
我使用Hibernate 3.6,我有如下内容:Java Hibernate单向OneToMany delete违反约束(可选=父端为false?),java,hibernate,jpa-2.0,hibernate-mapping,Java,Hibernate,Jpa 2.0,Hibernate Mapping,我使用Hibernate 3.6,我有如下内容: @Entity public class Parent { @OnyToMany( fetch = FetchType.LAZY, cascade = { ascadeType.ALL } ) @Cascade( { org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE )
@Entity
public class Parent {
@OnyToMany( fetch = FetchType.LAZY, cascade = { ascadeType.ALL } )
@Cascade( { org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE )
@JoinColumn( name="Parent_ID" )
public List<Child> getChildren() { return children; }
public void setChildren( List<Child> children ) { this.children = children; }
private transient List<TitleMetadataCategory> children;
...
}
@Entity
public class Child {
....
}
在子端,Hibernate尝试用PARENT_ID=NULL更新子级,但由于DB约束而失败
有什么办法解决它吗?你试过了吗
@JoinColumn(name = "Parent_ID", nullable = false)
?
另外,请注意,附加的实体是自动持久的。使用当前配置,您不需要调用
saveOrUpdate()
,Hibernate不知道从子对象
集合中删除子对象时必须将其删除(称为孤立删除)。您需要在父级中使用@OneToMany(orphaneremovation=true)
org.hibernate.annotations.CascadeType.DELETE
仅指定在删除整个父项时也应删除子项。JB Nizet的答案有效,但有一个更正。因为我还有Child.getParentId()方法(不是getParent()),所以它的列注释除了Parent.getChildren()中的nullable=false,insertable=false,updateble=false
参数之外,还应该有nullable=false,updateable=false
关联。单向hibernate不允许将关联映射到没有连接的实体。它已通过数据库中的Child.Parent\u ID列作为映射进行连接。我已尝试并获取了org.hibernate.MappingException:实体Parent\u ID异常映射中的重复列。这表示您已映射子实体中的parentId列桌子您不应该这样做,因为它已经映射为父表中的联接列。如果孩子知道自己的父母,那么就将其设置为双向关联。如果它不知道,那么它不应该映射parent_id列。你确实也需要删除孤立项。是的,我有几个带有孤立项删除的双方向映射,它可以工作。然而,父母有大约15种类型的孩子,其中一些孩子有自己的孩子。我很害怕为每一个定义双向映射,因为我已经有了一些级联确认。我已经尝试过了,但它不起作用,因为hibernate首先调度更新操作,然后才检查它是否是孤立的,并调度删除操作。结果,队列中有删除操作,但更新之前会引发异常。然后与JB Nizet建议的@JoinColumn(name=“Parent\u ID”,nullable=false)
一起尝试
@JoinColumn(name = "Parent_ID", nullable = false)