有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java多通单向禁用约束

我有以下单向多通关系:

@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: integrity constraint violated - child record found

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

我如何改变这种关系


共 (3) 个答案

  1. # 1 楼答案

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

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

  2. # 2 楼答案

    也许在manytone上使用可选的=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创建模式。目标是使外键字段在数据库中可以为空

  3. # 3 楼答案

    事实上,这是可以做到的

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

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

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