gpt4 book ai didi

java - Hibernate 不会在特定字段上级联更新

转载 作者:行者123 更新时间:2023-11-30 06:13:34 25 4
gpt4 key购买 nike

我在 hibernate 时遇到映射问题。在 @OneToOne 关系中,我不想将更新级联给合作伙伴。这是我当前的映射:

实体类:

public class Entity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

@OneToOne(orphanRemoval = false)
@JoinColumns({
@JoinColumn(name = "instrumentMandant", referencedColumnName = "mandant", updatable = false, insertable = false, nullable = true),
@JoinColumn(name = "instrumentId", referencedColumnName = "internalId", updatable = false, insertable = false, nullable = true) })
private Instrument instrument;
}

仪器:

public class Instrument{
@Id
private Integer internalId;
@Id
private Integer mandant;

@OneToOne(mappedBy = "instrument")
private Entity entity;
}

每当我更新 Entity 类时,Instrument 都不应更新。如您所见,我尝试使用 updateable = false,但它仍然尝试更新。我知道因为这个错误:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: Instrument

到目前为止,我唯一的解决方法是在更新调用之前调用 setInstrument(null);。但我相信这应该可以通过映射配置实现,但找不到方法来做到这一点。

所以我的问题是,如何告诉hibernate在更新Entity(通过映射配置)时不要更新Instrument

<小时/>

按要求更新:

sessionFactory.getCurrentsession().merge(entity);

交易内没有任何其他变化

最佳答案

问题是您有一个持久对象(实体) - 该对象已成功合并。然后,该持久对象与另一个受管理的对象有关系。即代码告诉 hibernate 它也必须管理该对象(仪器)。

因为你已经告诉hibernate不要级联合并,hibernate也不会合并仪器对象。因此,当 hibernate 尝试完成事务时,您会收到错误,因为在合并结束时,存在一个 Entity 对象,该对象通过指向 Instrument 的链接进行持久化,而该 Instrument 应该被持久化,但实际上却没有。

你的变通办法实际上根本不是一种变通办法,而是实现你所追求的目标的确切方法。

或者您希望当前持久化的仪器对象成为与 Enity 链接的对象?在这种情况下,您必须自己加载并设置它。

一个更有趣的问题是为什么您不希望仪器对象被持久化,因为它被标记为持久化。

关于java - Hibernate 不会在特定字段上级联更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49748552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com