Hibernate不会在特定字段

时间:2018-04-10 08:11:09

标签: java hibernate jpa hibernate-mapping

我遇到了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);

交易中没有任何其他变化

1 个答案:

答案 0 :(得分:1)

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

因为你告诉hibernate不要级联合并hibernate也不合并仪器对象。因此,当hibernate尝试完成事务时,您会收到错误,因为在合并结束时,Entity对象会持有一个指向Instrument的链接,该链接应该保留但不是。

你解决的问题实际上并不是一种解决方法,而是实现听起来像你之后的确切方法。

或者您希望当前持久的乐器对象是与Enity链接的乐器对象吗?在这种情况下,您必须加载并自行设置。

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