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

Hibernate删除的对象将通过级联重新保存

钦高峯
2023-03-14

我正在尝试删除hibernate中的子实体,但遇到以下异常:

 org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [com.epic.ecommerce.core.model.Customer#newnameTest]
at org.hibernate.internal.SessionImpl.forceFlush(SessionImpl.java:1236)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:187)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:114)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:684)
at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:676)
at org.hibernate.engine.spi.CascadingActions$5.cascade(CascadingActions.java:235)
at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:350)
at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:293)...

这些是我的实体:

@Entity

@table(name=“Customer”)公共类Customer{

    @Id
    @Column(name="customer_id")
    @GeneratedValue(generator="gen")
    @GenericGenerator(name="gen", strategy="foreign",parameters=@Parameter(name="property", value="user"))
    private String id;

@OneTomany(Cascade=CascadeType.All,MappedBy=“CustomerID”,OphanRemoval=True)私有集QuoteConfig;

    public Set<QuoteConfiguration> getQuoteConfigs() {
    return quoteConfigs;
    }

    public void setQuoteConfigs(Set<QuoteConfiguration> quoteConfigs) {
    this.quoteConfigs = quoteConfigs;
    }


    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @OneToOne
    @PrimaryKeyJoinColumn
    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }



@Entity
@Table(name="quote_configuration")
public class QuoteConfiguration implements java.io.Serializable{

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "quote_id",unique = true, nullable = false)  
private Integer quoteId;

@Column(name = "base_product", nullable = false)
private String baseProduct;

@Column(name = "quote_name")
private String quoteName;   

/*
@Column(name = "customer_customer_id")
private String customerId;

public String getCustomerId() {
    return customerId;
}

public void setCustomerId(String customerId) {
    this.customerId = customerId;
}
*/
@ManyToOne(cascade=CascadeType.ALL) 
@JoinColumn(name = "customer_customer_id")
private Customer customerId;


public Customer getCustomerId() {
    return customerId;
}

public void setCustomerId(Customer customerId) {
    this.customerId = customerId;
}

这是我想要移除的部分

    Session session = this.sessionFactory.getCurrentSession();
    Query q = session.createQuery("from QuoteConfiguration where quoteId = :quoteId ");
    q.setParameter("quoteId", quoteId);
    QuoteConfiguration quote = (QuoteConfiguration)q.list().get(0);

    Query qc=session.createQuery("from Customer where id=:id");
    qc.setParameter("id", quote.getCustomerId().getId());

    Customer customer=(Customer)qc.list().get(0);
    customer.getQuoteConfigs().remove(quote);
    session.delete(quote);
    session.save(customer);

我的问题是如何删除子实体QuoteConfiguration,而不在Customer中获得关联异常。谢谢

共有1个答案

荀振国
2023-03-14

只需从代码中删除会话.delete(quote)

您的@OneTomany集合是记录的主机,并且已经将其设置为删除孤立元素。因此,当您执行customer.getQuoteConfigs().remove(quote)时,它已经告诉Hibernate从数据库中删除记录。

需要注意的是,您应该尝试session.get(class,id)而不是使用HQL来获取单个实例。

您不需要save(customer),因为Hibernate始终跟踪持久化实例。它们将在事务关闭时自动保存(除非您的会话设置为手动,这不应该)。

 类似资料:
  • 问题内容: 我有以下两个实体: 1-播放列表: *保存或更新播放列表实体时,需要使用 *CascadeType.ALL 来保存和更新PlaylistadMap集合。 orphanRemoval = true :在删除播放列表实体时需要,PlaylistadMap引用也应删除。 2- PlaylistadMap: 使用我删除播放列表时,出现以下异常: 请告知如何解决此异常。 问题答案: 将 Fetc

  • 问题内容: 我收到上述错误“ org.hibernate.ObjectDeletedException:被删除的对象将通过级联重新保存(从关联中删除已删除的对象):”。有人可以帮我这个问题是什么,应该怎么解决? 谢谢。 问题答案: 没有映射结束代码会有点困难…这通常是由于要删除与集合关联的对象引起的。 您必须从拥有的收藏夹中删除对象,然后再删除对象 但是您可以通过这种方式使用deleteOrpha

  • 问题内容: 我对级联=“删除”的工作方式感到困惑。我在“城市”映射文件中以以下方式定义了映射: 类客户具有类城市的外键。 因此,当我运行时: 是否还应该删除所有客户端,还是必须以某种方式处理它?我是否将查询作为方法参数正确传递给会话的delete()方法?谢谢你的帮助。最好的问候,混蛋。 问题答案: 我对cascade =“ delete”的工作方式有些困惑(…) 级联操作意味着,如果您是父母,则

  • 问题内容: 我在我的数据库3个表:,和 学生可以有多个课程,课程可以有多个学生。和之间存在多对多关系。 我为我的项目和课程添加了3个案例。 (a)当我添加用户时,它会保存得很好, (b)当我为学生添加课程时,它会在-预期行为中创建新的行。 (三)当我试图删除学生,则在删除适当的记录和,但它也删除其中不需要的记录。即使课程中没有任何用户,我也希望课程在那里。 下面是我的表和注释类的代码。 这是Hib

  • 问题内容: 我一直在搞怪它并使用它搜索了大约4天,我对Hibernate注释如何与JPA注释一起工作感到疯狂。我有两个非常简单的实体: 学生 电话 我将整个代码粘贴到这里,以便您可以看到导入的来源。我认为问题就在那里。 重要提示 :我使用的是Hibernate Docs建议的 好!现在,我创建了一个包含两个电话号码的,并将其正确保存在数据库中。这将创建以下内容: 学生 学生电话 电话 问题来了。如

  • 我试图通过联接表的一个外键级联删除联接表中的行,它有另一个与之相关的表,我也想删除与此ID相关的所有行。看起来像下图。当我使用会话时。使用hibernate删除(reqCandObject)它工作正常,并通过从候选jobReq表中删除一个条目以及相关注释进行级联。但是,我想删除所有具有特定候选ID的候选项(并删除注释)。我尝试了下面的函数,但与nice hibernate不同。删除(对象)函数,此