1

我有以下单向多对一关系:

@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: 违反完整性约束 - 找到子记录

我需要的是即使父实体有子实体也会被删除,但子实体应该保留。

我该如何改变这种关系?

4

3 回答 3

1

如果使用关系,则不能使用 JPA。使其成为 ManyToOne 表示外键字段中的值将存在于 Parent 表中。JPA 将无法区分空 fk 值和父表中没有关联行的 fk 值。

如果确实必须这样做(而且它不应该在 IMO 中完成),则需要使用基本映射而不是 ManyToOne 来映射 Child 中的 Integer 外键值。这允许它独立于现有的 Parent 实体进行设置 - null 表示 null,值表示值。然后,如果需要实体本身,您可以查询关联的父实体。

于 2013-07-31T21:21:55.630 回答
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 创建模式。目标是使数据库中的外键字段可以为空。

于 2013-07-31T16:28:10.847 回答
0

其实是可以做到的。

@JoinColumn(foreignKey = @ForeignKey(name = "none"))

在描述包含此外键列的表时,将外键指定为缺少引用完整性约束是合乎逻辑的。

当然,在开发某些 OLTP 系统时,移除 Presistence 层中的参照完整性约束并不是最佳实践;但是对于类似数据仓库的解决方案(首先加载数据然后检查它作为一个整体),这可能是正确的方法。

于 2020-07-28T09:32:19.317 回答