【问题标题】:Hibernate, Persistence and @OneToMany and @ManyToOne annotations problemsHibernate、Persistence 和@OneToMany 和@ManyToOne 注释问题
【发布时间】:2010-08-13 07:51:58
【问题描述】:

@OneToMany 和 @ManyToOne 注释有一些问题。

我有两个类 Suite 和 SuiteVersion。 SuiteVersion 依赖于套件。所以我在我的代码中实现了这个:

班级套件:

@OneToMany(mappedBy = "suite")
@Cascade(CascadeType.DELETE_ORPHAN)
private List<SuiteVersion> listSuiteVersion = new ArrayList<SuiteVersion>();

类套件版本:

@ManyToOne()
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE})
private Suite suite;

但是当我删除一个关联了 SuiteVersion 的套件时,我遇到了一些问题。 Hibernate 不会在 Suite 之前删除 SuiteVersion。我不知道为什么,因为我在代码中提到了这一点:

@Cascade(CascadeType.DELETE_ORPHAN)

这是我删除套件时获得的日志:

休眠:从 ID_SUITE=? 的 SUITE 中删除 13 août 2010 09:40:50 org.hibernate.util.JDBCExceptionReporter logExceptions 注意:SQL 错误:-8,SQLState:23504 13 août 2010 09:40:50 org.hibernate.util.JDBCExceptionReporter logExceptions GRAVE:违反完整性约束:外键无动作; FK42895651EA304E6 表:SUITE_VERSION

提前感谢您的帮助。

最好的问候,

弗洛伦特,

P.S : 对不起我的英语我是法国人。

【问题讨论】:

    标签: java hibernate orm persistence one-to-many


    【解决方案1】:

    但是当我删除一个关联了 SuiteVersion 的套件时,我遇到了一些问题。 Hibernate 不要在Suite 之前删除SuiteVersion

    那是因为您REMOVE 操作从Suite 级联到SuiteVersion。要获得所需的结果,您需要这样的东西(假设您使用的是 JPA 1.0):

    @OneToMany(mappedBy = "suite", cascade = javax.persistence.CascadeType.REMOVE)
    @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
    private List<SuiteVersion> listSuiteVersion = new ArrayList<SuiteVersion>();
    

    我在这里使用完全限定名称来清楚地显示特定于 Hibernate 和标准 JPA 注释。

    Hibernate 特定的CascadeType.DELETE_ORPHAN 是另外一回事,它用于告诉 Hibernate如果您从集合中删除特定的 SuiteVersion,则删除它(没有它,SuiteVersion 记录将更新以删除到父 Suite 的链接,但仍会保留在表中,因此是“孤儿”)。

    请注意,如果您使用的是 JPA 2.0(即 Hibernate 3.5+),现在有一种处理孤立记录的标准方法,即不使用 Hibernate 特定的注释。您可以在OneToMany(和OneToOne)关联中指定orphanRemoval 选项。像这样:

    @OneToMany(mappedBy = "suite", cascade = CascadeType.REMOVE, orphanRemoval = true)
    private List<SuiteVersion> listSuiteVersion = new ArrayList<SuiteVersion>();
    

    但这超出了这个问题,因为这实际上不是你要找的。​​p>

    【讨论】:

    • 你是对的。当您从集合中删除关联的实体时,DELETE_ORPHAN 才有效。 (+1)
    • 谢谢,这对我帮助很大。但是在我了解您的帖子之前,我已经迁移到 jpa 2.0。在您的帖子末尾,您谈到了一种处理孤儿的新标准方法。你能解释一下处理这个孤儿的新方法吗?
    • @Delildor:不客气。关于 JPA 2.0 的孤儿,请参阅我的更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 2015-02-13
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多