【问题标题】:How to realize ON UPDATE CASCADE and ON DELETE CASCADE in Hibernate(JPA)?如何在 Hibernate(JPA) 中实现 ON UPDATE CASCADE 和 ON DELETE CASCADE?
【发布时间】:2013-06-18 19:22:35
【问题描述】:

我有两个表:AccountsMails

帐户中的 1 个用户可以收到一些邮件(1 : M 认证)。

  • 当用户删除他的个人资料(来自Accounts)时,休眠应该删除该用户的所有邮件(来自Mails)。 Accounts 有 id (PK) 和其他列。 Mails 有 id(PK)、user_id(FK: user_id -> Accounts.id) 等列。

如何在 Hibernate(或 JPA)上实现上述类型的实现?

我的实体类如下:

//Accounts class
@OneToMany(mappedBy = "accounts", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<Mails> mails;

//Mails class
@ManyToOne
@JoinColumn(name="user_id" , referencedColumnName="id", insertable=false, updatable=false)
private Accounts accounts;

但是当我正在编辑或删除一些父行时,hibernate 说:无法删除或更新父行:外键约束失败。那么我到底在哪里犯了错误?


更新

当我们执行 SQL 或 HQL 查询时会发生此错误,但事实并非如此。我们应该使用 entitymanager.remove 或 entitymanager.merge 方法。我的实体类是有效的。

【问题讨论】:

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


    【解决方案1】:

    您的帐户和邮件之间似乎存在双向关系。 在帐户类中,您必须使用一些想法,例如:

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "accounts")  
    private Set<Mails> mails;
    

    双向需要属性 mappedby。 提示:在我看来,如果真的有必要,你应该只使用双向关系。

    【讨论】:

    • 对不起,我错过了你已经定义了 mappedBy。检查邮件类的可插入和可更新属性。也尝试使用 nullable=false。您还可以在 persistence.xml 中将属性 hibernate.show_sql 设置为 true,以查看从合并或删除生成的 sql。
    猜你喜欢
    • 2015-01-27
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 2015-12-31
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多