休眠不对特定字段进行级联更新



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

Entity类:

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;
}

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: 对象引用未保存的 瞬态实例 - 在刷新之前保存瞬态实例: 仪器

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

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


根据要求更新:

sessionFactory.getCurrentsession().merge(entity);

事务内部没有任何其他更改

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

因为您已经告诉休眠不要级联合并休眠也不会合并仪器对象。因此,当休眠尝试完成事务时,您会收到错误,因为在合并结束时有一个实体对象,该对象通过指向仪器的链接持久化,该工具应该持久化,但未持久化。

实际上,您的变通方法根本不是一种变通方法,而是实现听起来像您所追求的确切方法。

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

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

最新更新