无法在休眠中删除 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 关系的实例的主要内容,如果未能解决你的问题,请参考以下文章