Hibernate - 如何使用仅指定单向子关系的注释来级联删除

时间:2010-01-24 06:19:21

标签: java hibernate jpa annotations

假设我有两个实体父对象和一个子对象。我希望孩子有一个指定给父实体和引用的关系,但我不希望父母必须知道它。这样做的原因是存在许多这样的关系并明确指定所有这些子关系将意味着不断更新和污染父对象。但是,我仍然希望删除父对象以级联到子级。作为附加约束,子对象仅通过设置引用父代ID的属性来引用父实体集。假设我有类似的东西:

@Entity
class Child {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    @Column(nullable=false)
    private Long parentId;

    @ManyToOne(fetch=FetchType.LAZY, optional=false)
    @JoinColumn(name="parentId", insertable=false, updatable=false, nullable=false, unique=false)
    private Parent parentEntity;

    // etc...

}

@Entity
class Parent {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    // etc...   
}

那么是否有任何方法可以将父对象的删除级联到子级而不向父实体添加其他关系?

仅使用JPA注释的解决方案将是首选,但任何帮助都将受到赞赏。

2 个答案:

答案 0 :(得分:3)

不,这是不可能的。

Cascades(任何类型)遍历关系。如果你没有告诉JPA关于从A到B之间的关系(即使从B到A有一个),那么它就不能自动遍历它。

旁注:只指定父ID而不是父实体将使其更加困难。 Hibernate / JPA不是正确的工具,你需要接受它的工作方式,这意味着指定和维护对象关系。

答案 1 :(得分:1)

直接添加parentId而不是父级会让您的生活变得更加艰难。 Hibernate只在数据库中保存一个id。那你自己做点什么呢? 回到你的问题。你必须使关系双向并将cascade = CascadeType.ALL添加到你的children属性,它本身是mappedBy =“parent”。它很小,很简单,很快。