我遵循单向ManyToOne关系:
@Entity
@Table(name = "Child")
public class Child {
@Id
private Integer id;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Parent parent;
}
@Entity
@Table(name = "parent")
public class Parent{
@Id
private Integer id;
}
当我尝试从数据库中删除父实体时,我有约束违规。
ORA-02292:违反完整性约束 - 找到子记录
我需要的是父母实体即使有子女也会被删除,但子实体应该留下来。
如何更改此关系?
答案 0 :(得分:1)
如果使用关系,则不能使用JPA。使其成为ManyToOne表示外键字段中的值将存在于父表中。 JPA将无法区分null fk值,并且存在一个fk值,该值在Parent表中没有关联的行。
如果确实必须这样做(并且它不应该是IMO),则需要使用基本映射而不是ManyToOne映射Child中的Integer外键值。这允许它独立于存在的父实体而设置 - null表示null,值表示值。然后,如果需要实体本身,则可以查询关联的父实体。
答案 1 :(得分:0)
也许ManyToOne上的optional = true参数会有帮助吗?
@Entity
@Table(name = "Child")
public class Child {
@Id
private Integer id;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, optional = true)
private Parent parent;
}
我假设您直接从Hibernate创建架构。目标是使外键字段在数据库中可以为空。
答案 2 :(得分:0)
实际上,可以做到。
@JoinColumn(foreignKey = @ForeignKey(name = "none"))
在描述包含该外键列的表时,将外键指定为缺少参照完整性约束是唯一合乎逻辑的。
在开发某些OLTP系统时,当然最好不要删除持久性层中的参照完整性约束。但对于类似数据仓库的解决方案(首先加载数据,然后整体检查),这可能是正确的方法。