ManyToOne单向禁用约束

时间:2013-07-31 15:47:53

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

我遵循单向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:违反完整性约束 - 找到子记录

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

如何更改此关系?

3 个答案:

答案 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系统时,当然最好不要删除持久性层中的参照完整性约束。但对于类似数据仓库的解决方案(首先加载数据,然后整体检查),这可能是正确的方法。