【问题标题】:Java - Merge Hibernate beans/entities - before saveOrUpdateJava - 合并休眠 bean/实体 - 在 saveOrUpdate 之前
【发布时间】:2011-08-09 17:05:32
【问题描述】:


在 saveOrUpdate 之前合并 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 和 @ManyToOne

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

谢谢

【问题讨论】:

    标签: java hibernate merge entity


    【解决方案1】:

    当您在数据库中已经有一个托管实体可供使用时,为 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 中,那很好。尽管根据您提供的信息,没有任何理由让它比这更复杂。

    【讨论】:

    • 我想跳过这集。放。放。并使其自动化......当使用大豆时,它更干净。
    • 嗯,我明白你现在在问什么了。它实际上是关于如何使神奇的“合并”方法起作用的内部设计?如果你能清楚地定义它的要求,它可能会自己写。你使用什么框架?例如,Spring 中的 DataBinder 将使您想要发生的事情变得微不足道。
    • 这确实是一个完美的建议:DataBinder,如果搜索一天后!!!,谢谢
    猜你喜欢
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    相关资源
    最近更新 更多