Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 冬眠唐';特定字段上的t级联更新_Java_Hibernate_Jpa_Hibernate Mapping - Fatal编程技术网

Java 冬眠唐';特定字段上的t级联更新

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(

我在hibernate中有一个映射问题。在
@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加载实体,并用新实体的值更新它。。。这可能是最干净的方法