当前位置: 首页 > 知识库问答 >
问题:

无法在Hibernate中删除OneTo多项关系的实例

谷梁卓
2023-03-14

我有一个OneTo多项关系,我可以插入记录,但不能删除它们,当我试图删除它时,它会遇到“外键约束失败”错误。我使用级联删除孤儿如下,但不工作还。

父类的成员具有以下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();

共有3个答案

萧奇
2023-03-14

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

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

我正在使用实体管理器删除方法,它对我很有效。我用集合代替列表,在我看来这是一种有效的方法。

删除孤儿注释只是为了告诉Hibernate,如果"我从MessageList中删除实体并尝试合并用户,那么你可以安全地删除消息"

@Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
吕征
2023-03-14

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

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

....

@ManyToOne
public User getReciever() {
        return reciever;
}

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

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

我希望有帮助。

干杯

漆雕绍晖
2023-03-14
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 
 类似资料:
  • 我目前在数据库中的一对一/多对一映射时遇到问题。我希望我的图书表具有与“出版商”、“流派”、“评级”和“状态”表的@ManyToOne映射。 这是我的Book实体类的外观: 例如,我的Publisher实体类(类型、评级和状态类完全相同): 唯一的区别是类型、评级和状态的书籍字段,f. e: 这就是我的堆栈跟踪的样子: 更新的堆栈跟踪:

  • 我的实体: 这就是我的问题,实际上很少有。 问题1: 我删除了一个Cat对象,设置了cascade类型。所有在Cat中拥有的列表中,因此当我删除Cat对象时,UC中带有Cat的所有记录都将被删除,但我得到“已删除的对象将通过级联重新保存”,这是因为我在UC中与用户有另一个关系,用户将UC存储在列表中。当我从UC中删除Cat对象和记录时,我不想删除用户对象,因此在UC中的@ManyToOne上设置c

  • 我使用的是spring boot starter数据jpa 1.5.1。内部使用hibernate core 5.0.11的版本。最终的 我的实体看起来像这样: 区域 节日的 行动 我试图理解以下观点: > 我的映射是准确的,还是应该使用多重映射来处理这种关系,因为一个区域可以有多个节日,每个节日可以有多个动作 背景:如果我将fetch类型从LAZY改为eanger,就会出现以下错误。希望能够理解

  • 我试着在这里找到类似的问题,我在这里找到了这个,但它没有太大的帮助。 这正是我的问题所在。问题是@ondelete迫使我建立双向关系,对吗?如果可能的话,我想保持单向性。 L.E:我修改了我的处理程序方法,看起来像这样

  • 在使用Hibernate删除与子实体具有关系的JPA实体时,我遇到了一个问题,但是在使用EclipseLink而不是Hibernate作为JPA提供程序时,相同的代码可以正常工作。父实体上的批注是 当使用Hibernate时,它尝试将子实体上的join列设置为null,但由于该列不允许null而失败。使用EclipseLink时,它首先删除子实体,然后删除父实体,这是所需的行为。 我的问题是: 为

  • 问题内容: 我要删除具有多对多关系的一个站点上的表中的一行。我还想删除该关系另一侧的所有相关行。 例如,假设我有以下表格,并且想从中删除一行。我也想从中删除所有相关的行,当然,也删除其中不再需要的任何行。 我知道如何在查询中连接以上表格。但是我看不到如何删除整个关系中的数据。 注意:关系的两端都实现级联删除。因此,例如,从中删除行将删除中的任何相关行。但是显然,这不会传播到表中。 问题答案: 我认