【问题标题】:ManyToOne Unidirectional Disable ConstraintManyToOne 单向禁用约束
【发布时间】:2013-08-01 06:00:21
【问题描述】:

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

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

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

如何改变这种关系?

【问题讨论】:

    标签: java hibernate jpa constraints many-to-one


    【解决方案1】:

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

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

    【讨论】:

    • @Basic。这是非实体类型的默认映射
    【解决方案2】:

    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 创建架构。目标是使数据库中的外键字段可以为空。

    【讨论】:

    • 根据文档默认是可选的
    • 啊,是的,好点 - 无论如何,这在删除父级时对您没有帮助。是否可以接受双向关系(父端的 OneToMany 集合),以便您可以将每个子节点的父节点显式设置为 null?
    【解决方案3】:

    其实是可以的。

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

    当您描述包含此外键列的表时,将外键指定为缺乏参照完整性约束是合乎逻辑的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 2011-02-10
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 2021-02-14
      • 1970-01-01
      相关资源
      最近更新 更多