Hibernate 不会在特定字段上级联更新
Hibernate don't cascade update on specific field
我有休眠映射问题。在 @OneToOne
关系中,我不想将更新级联到合作伙伴。这是我当前的映射:
Entity
class:
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
class 时,Instrument
不应更新。如您所见,我尝试使用 updateable = false
,但它仍会尝试更新。我知道是因为这个错误:
org.hibernate.TransientObjectException: object references an unsaved
transient instance - save the transient instance before flushing:
Instrument
到目前为止,我唯一的解决方法是在调用更新之前调用 setInstrument(null);
。但是我相信这应该可以通过映射配置实现,但是找不到方法。
所以我的问题是,如何在更新Entity
(通过映射配置)时告诉hibernate不更新Instrument
?
按要求更新:
sessionFactory.getCurrentsession().merge(entity);
交易中没有任何其他变化
问题是您有一个持久对象(实体)- 该对象已成功合并。然后该持久对象与另一个同样被管理的对象有关系。即代码告诉休眠它也必须管理该对象(仪器)。
因为你已经告诉 hibernate 不要级联合并 hibernate 也不会合并 instrument 对象。因此,当 hibernate 尝试完成事务时,您会收到错误消息,因为在合并结束时,存在实体对象,该对象通过 link 持久保存到仪器中,该对象应该被持久保存但没有。
你的解决方法实际上根本不是解决方法,而是实现你所追求的目标的确切方法。
或者您是否希望当前持久化的仪器对象成为 link使用 Enity 编辑的对象?在这种情况下,您将不得不自己加载并设置它。
一个更有趣的问题是为什么您不希望工具对象持久化,因为它被标记为持久化。
我有休眠映射问题。在 @OneToOne
关系中,我不想将更新级联到合作伙伴。这是我当前的映射:
Entity
class:
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
class 时,Instrument
不应更新。如您所见,我尝试使用 updateable = false
,但它仍会尝试更新。我知道是因为这个错误:
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: Instrument
到目前为止,我唯一的解决方法是在调用更新之前调用 setInstrument(null);
。但是我相信这应该可以通过映射配置实现,但是找不到方法。
所以我的问题是,如何在更新Entity
(通过映射配置)时告诉hibernate不更新Instrument
?
按要求更新:
sessionFactory.getCurrentsession().merge(entity);
交易中没有任何其他变化
问题是您有一个持久对象(实体)- 该对象已成功合并。然后该持久对象与另一个同样被管理的对象有关系。即代码告诉休眠它也必须管理该对象(仪器)。
因为你已经告诉 hibernate 不要级联合并 hibernate 也不会合并 instrument 对象。因此,当 hibernate 尝试完成事务时,您会收到错误消息,因为在合并结束时,存在实体对象,该对象通过 link 持久保存到仪器中,该对象应该被持久保存但没有。
你的解决方法实际上根本不是解决方法,而是实现你所追求的目标的确切方法。
或者您是否希望当前持久化的仪器对象成为 link使用 Enity 编辑的对象?在这种情况下,您将不得不自己加载并设置它。
一个更有趣的问题是为什么您不希望工具对象持久化,因为它被标记为持久化。