Java-合并Hibernate bean/实体-在saveOrUpdate之前

Java-合并Hibernate bean/实体-在saveOrUpdate之前,java,hibernate,merge,entity,Java,Hibernate,Merge,Entity,在保存或更新之前,合并2个休眠实体的最佳方法是什么。 我从用户(提交的表单)获得一个实体,并希望使用saveOrUpdate保存它。 如果用户bean中不存在所有字段,Hibernate会将其设置为空(用户只能更新部分数据)。 这就是我希望它看起来的样子: //this is the data the submitted from the user form. PersonEntity entityFromTheClient = getPersonEntityFromClient(); //t


在保存或更新之前,合并2个休眠实体的最佳方法是什么。
我从用户(提交的表单)获得一个实体,并希望使用saveOrUpdate保存它。
如果用户bean中不存在所有字段,Hibernate会将其设置为空(用户只能更新部分数据)。
这就是我希望它看起来的样子:

//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和@manytomone

正如您已经了解的,此情况仅用于更新。插入将是一个不同的故事


感谢

创建第三个要保存或更新的对象,当您已经有一个数据库中的托管实体可供使用时,这看起来确实很奇怪。只需将允许用户更改的字段复制到托管对象上并提交事务即可。实际上甚至不需要显式地使用saveOrUpdate,除非您对getFromDB方法中的事务边界做了一些奇怪的事情

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中,那没关系。根据您提供的信息,没有任何理由让它变得更复杂。

创建第三个要保存或更新的对象似乎很奇怪,因为您已经有一个数据库中的托管实体要处理。只需将允许用户更改的字段复制到托管对象上并提交事务即可。实际上甚至不需要显式地使用saveOrUpdate,除非您对getFromDB方法中的事务边界做了一些奇怪的事情

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中,那没关系。根据您提供的信息,没有任何理由让它变得更复杂。

我想跳过这一集。设置设置并使其自动化。。。当使用大豆子时,它更干净。嗯,我明白你现在的要求了。它实际上是关于如何使神奇的“合并”方法工作的内部设计?如果您能清楚地定义它的需求,它可能会自己编写。您使用的是什么框架?例如,春天的DataBinder会让你想要发生的事情变得非常琐碎。这确实是一个完美的建议:DataBinder,如果搜索一天后!!!,谢谢,我想跳过这一集。设置设置并使其自动化。。。当使用大豆子时,它更干净。嗯,我明白你现在的要求了。它实际上是关于如何使神奇的“合并”方法工作的内部设计?如果您能清楚地定义它的需求,它可能会自己编写。您使用的是什么框架?例如,春天的DataBinder会让你想要发生的事情变得非常琐碎。这确实是一个完美的建议:DataBinder,如果搜索一天后!!!,谢谢