我遇到了hibernate的映射问题。在@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:object引用未保存的 瞬态实例 - 在刷新之前保存瞬态实例: 仪器
我唯一的解决方法是在更新调用之前调用setInstrument(null);
。但我相信这应该可以通过映射配置实现,但无法找到方法。
所以我的问题是,在更新Instrument
(通过映射配置)时,如何告诉hibernate不要更新Entity
?
按要求更新:
sessionFactory.getCurrentsession().merge(entity);
交易中没有任何其他变化
答案 0 :(得分:1)
问题是你有一个持久对象(Entity) - 该对象已成功合并。然后,该持久对象与另一个也被管理的对象有关系。即代码告诉hibernate它也必须管理该对象(仪器)。
因为你告诉hibernate不要级联合并hibernate也不合并仪器对象。因此,当hibernate尝试完成事务时,您会收到错误,因为在合并结束时,Entity对象会持有一个指向Instrument的链接,该链接应该保留但不是。
你解决的问题实际上并不是一种解决方法,而是实现听起来像你之后的确切方法。
或者您希望当前持久的乐器对象是与Enity链接的乐器对象吗?在这种情况下,您必须加载并自行设置。
一个更有趣的问题是,为什么你不希望仪器对象持续存在,因为它被标记为持久性。