更新单个实体而不影响其在Hibernate中的依赖关系

时间:2017-10-19 14:33:14

标签: java hibernate

考虑以下情况:

我有一个Person实体,它与Group实体有多对多关系,与Role实体有多对多的关系。两个实体都与Person设置CascadeType到SAVE_UPDATE具有双向关系。 FetchType设置为LAZY。

人还有姓名,生日,身份等属性。

由于我在繁重的事务多线程环境中工作,作为设计考虑因素,当要修改某个Person属性时,通过hibernate会话的get方法检索的Person对象正在使用以下方法复制:

    public Person personCopyWithoutDependencies(Person entity){
        Person person = new Person();
        person.setId(entity.getId());
        person.setName(entity.getName());
        person.setBirthdate(entity.getBirthdate());
        person.setGroups(null);
        person.setRoles(null);
        return copy;
    }

然后,我在复制对象中进行Person的特定属性修改,然后调用Hibernate会话的Update方法。完成复制是为了防止多个线程中的多个会话出现问题(在执行修改时调用sessionFactory.openSession()并在提交时关闭,而在调用objtect sessionFactory.getCurrentSession()时)。

如果我修改的person对象之前已关联Group和Role实体,则会删除数据库中的关系。

我想知道是否有可能在不失去关系的情况下进行我想要的修改。

非常感谢您提前。欢迎任何建议。

1 个答案:

答案 0 :(得分:0)

执行此操作的唯一方法是验证,更改了什么,然后检索REal Hibernate对象。

步骤:

  1. 你有一些带有一些属性的副本。 (NULL而不是代理惰性集合)
  2. 你确实改变了其中一些。
  3. 您可以从Hibernate(DB)
  4. 再次检索Real对象
  5. 您将对象属性映射回真实对象,而不是为NULL属性执行此操作。
  6. 提交更改。
  7. 这是实现此目的的唯一方法。正如@Gimbly所提到的,你正试图处理,Hibernate认为这样做。