在saveOrUpdate之前合并2个休眠实体的最佳方法是什么
我从用户那里得到一个实体(提交的表格),我想用saveOrUpdate保存它
如果用户bean中不存在Hibernate,那么Hibernate会将所有字段设置为null(用户只能更新部分数据)。
这就是我想要的样子:
//this is the data the submitted from the user form.
PersonEntity entityFromTheClient = getPersonEntityFromClient();
//this is the data that i pull from the db for the merge
PersonEntity entityFromDb = getPersonEntityFromDb(entityFromTheClient.getID()); //entityFromTheClient.getID() = PK
//this is the method that i need to merge entityFromTheClient into entityFromDb
PersonEntity dataMerged = (PersonEntity)SomeUtill.merge(entityFromTheClient,entityFromDb);
//this will save the merged data.
session.saveOrUpdate(dataMerged);
另请注意,Person可以包含其他实体成员@OneToMany @ManyToMany和@ManyToOne
如您所知,此情况仅供更新。插入将是一个不同的故事。
由于
答案 0 :(得分:1)
当你已经拥有一个Managed Entity从数据库那里工作时,为saveOrUpdate创建第三个对象似乎很奇怪。只需将允许用户更改的字段复制到托管对象并提交您的事务即可。除非你在getFromDB方法中对事务边界做了一些奇怪的事情,否则甚至不需要显式地使用saveOrUpdate。
Transaction tx = session.beginTransaction();
PersonEntity entityFromTheClient = getPersonEntityFromClient();
//this is the data that i pull from the db for the merge
PersonEntity entityFromDb = getPersonEntityFromDb(entityFromTheClient.getID());
entityFromDb.setA(entityFromTheClient.getA());
entityFromDb.setB(entityFromTheClient.getB());
tx.commit();
实际的事务处理当然取决于您的框架设置。
就是这样,完成了。如果你想在某种类型的Util中隐藏设置,那很好。根据您提供的信息,没有任何理由让它变得更复杂。