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 编辑的对象?在这种情况下,您将不得不自己加载并设置它。

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