Java 冬眠唐';特定字段上的t级联更新
我在hibernate中有一个映射问题。在Java 冬眠唐';特定字段上的t级联更新,java,hibernate,jpa,hibernate-mapping,Java,Hibernate,Jpa,Hibernate Mapping,我在hibernate中有一个映射问题。在@OneToOne关系中,我不想将更新级联到合作伙伴。这是我当前的映射: 实体类别: public class Entity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @OneToOne(orphanRemoval = false) @JoinColumns({ @JoinColumn(
@OneToOne
关系中,我不想将更新级联到合作伙伴。这是我当前的映射:
实体
类别:
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;
}
和仪器
:
public class Instrument{
@Id
private Integer internalId;
@Id
private Integer mandant;
@OneToOne(mappedBy = "instrument")
private Entity entity;
}
每当我更新我的实体
类时,不应更新工具
。如您所见,我尝试了updateable=false
,但它仍然尝试更新。我知道由于这个错误:
org.hibernate.transientObject异常:对象引用未保存的
瞬态实例-刷新前保存瞬态实例:
仪器
我对far的唯一解决方法是调用setInstrument(null)代码>在更新调用之前。然而,我相信通过映射配置,这应该是可能的,但是找不到一种方法来实现
所以我的问题是,当更新实体时(通过映射配置),我如何告诉hibernate不要更新仪器
按要求更新:
sessionFactory.getCurrentsession().merge(entity);
事务内部没有任何其他更改问题是您有一个持久对象(实体)-该对象已成功合并。然后,该持久对象与另一个同样受管理的对象具有关系。i、 代码告诉hibernate它也必须管理该对象(仪器)
因为您已经告诉hibernate不要级联合并,所以hibernate也不会合并仪表对象。因此,当hibernate尝试完成事务时,会出现错误,因为在合并结束时,存在实体对象,该实体对象被持久化,并带有指向该工具的链接,该工具应被持久化,但不被持久化
你的变通方法实际上根本不是一种变通方法,而是实现你所追求的目标的确切方法
还是希望当前的持久化工具对象是与Enity链接的对象?在这种情况下,您将不得不加载它并自行设置
一个更有趣的问题是,为什么不希望仪器对象被持久化,因为它被标记为持久化。我认为这是一个基于GUI的问题。用户可以使用实体
获取仪器
,并且应该能够单独保存(更新)它们。因此,我需要更新实体
,而不是仪器
。我是否应该“重新获取”用户编辑的实体
?这会不会使工具
不被标记为脏的?是的,听起来您最好的方法是从db加载实体,并用新实体的值更新它。。。这可能是最干净的方法