无法在休眠中删除 OneToMany 关系的实例

Posted

技术标签:

【中文标题】无法在休眠中删除 OneToMany 关系的实例【英文标题】:Can not delete an instance of OneToMany relationship in hibernate 【发布时间】:2013-07-31 01:23:14 【问题描述】:

我有一个 OneToMany 关系,我可以插入记录但不能删除它们,当我尝试删除它时会遇到“外键约束失败”错误。我已经使用了以下级联删除孤儿,但还不行。

父类的成员具有以下 getter

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;

@Entity
@DynamicUpdate
public class User extends Employee
    private string userli;
    privae List<Message> messagelist();

    .....

    @OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.REMOVE)
    public List<Message> getMessagelist() 
        return messagelist;
    

成员类的父类具有以下 getter

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
 ......  

   @ManyToOne
   public User getReciever() 
        return reciever;
   

我也使用了以下注释,但没有工作

     @Cascade(org.hibernate.annotations.CascadeType.DELETE)

我的休眠依赖如下

 <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>4.2.1.Final</version>
    <type>jar</type>
</dependency>

我删除消息的代码

            Message message = (Message) session.get(Message.class, id);
            session.delete(message);
            tx.commit();

【问题讨论】:

【参考方案1】:
Try to change the cascade = cascadeType.ALL 

and check

    @OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
    public List<Message> getMessagelist() 
            return messagelist;

It might work but not sure 

【讨论】:

【参考方案2】:

有几种方法可以处理 OneToMany 关系。最常见的方法之一是:

@OneToMany(mappedBy="receiver", CascadeType.REMOVE)
public List<Message> getMessagelist() 
        return messagelist;


....

@ManyToOne
public User getReciever() 
        return reciever;

请注意,fetch = FetchType.LAZY 是默认值,您实际上不需要指定它。

此外,您可能需要重新创建表,因为已经创建了 db 约束。在这种情况下,不要 100% 信任 hbm2ddl.auto=update。我建议删除相关表(Message、Reciver 和 Receiver_Message 或 Message_Receiver)。接下来,您可以使用 hbm2ddl.auto=update。

希望对你有帮助。

干杯

【讨论】:

使用你的代码后,没有抛出异常,但仍然无法删除记录。 是否从 Receiver_Message 或 Message_Receiver 表中删除?【参考方案3】:

尝试添加以下注释。它对我有用。

@OneToMany(mappedBy="receiver", cascade=CascadeType.ALL, fetch=FetchType.LAZY)  
@Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
 public Set<Message> getMessagelist() 
    return messagelist;

我正在使用实体管理器删除方法,它对我有用。在我看来,我使用 Set 而不是 List,这是一种有效的方式。

Delete orphan annotation 只是为了告诉 hibernate 如果“我从 MessageList 中删除实体并尝试合并 User 那么你可以安全地删除 Message”

@Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 

【讨论】:

以上是关于无法在休眠中删除 OneToMany 关系的实例的主要内容,如果未能解决你的问题,请参考以下文章

无法在 HIbernate 4 中保持 OneToMany 关系

OneToMany 关系中的休眠标准

无法在 Spring JPA 休眠中获取关系

具有 OneToMany 关系的休眠重复条目

OneToMany /可为空关系的休眠性能问题

非冗余休眠列表映射 (OneToMany)