安全更新hibernate实体的最佳方法是什么?

时间:2014-01-22 12:28:57

标签: java spring hibernate api rest

首先解释一下背景。我有后端Java(Spring / Hibernate)应用程序,我通过JMS访问。我有通过Url访问的客户端应用程序(RESTfull)。我有一个复杂的实体,有多个列表(大多数是懒惰的),这个实体是xy其他实体的组合。

问题:由于我通过URL访问它,因此我从URL参数在客户端应用程序中创建Java对象。我通过JMS将它发送到后端,但是在后端,我没有Hibernate对象,所以我不能简单地合并它。

我可以通过客户端传递所有内容,例如:

  • 通过id
  • 获取hibernate对象
  • 检查有什么不同
  • 设置新值
  • 更新

并为每个组合实体重复它,但我想知道是否有更优雅和“易于维护”的方式来更新此实体的所有更改。

我希望我解释得很清楚。提前谢谢!

2 个答案:

答案 0 :(得分:2)

根据您的描述,您遵循的步骤似乎是正确的。第一个(获取对象)和最后一个(更新对象)步骤是不可避免的。您可以优化的唯一地方是检查/设置部分。为此,您可以编写一个通用方法,该方法接受两个对象,并使用Reflection比较它们的更改。这样它就可以重复使用了。

以下是使用反射的示例code。改变它以满足您的需要

答案 1 :(得分:0)

如果您确信已获得修改后的实体字段的最新值(例如,通过保留乐观锁定版本字段)和/或您打算只覆盖所有已修改的字段,则无需检查是否字段是否更改。只需查找实体并设置您拥有的字段(包括ID和版本),Hibernate将覆盖您对数据库的更改(如果有),除非在此期间某个实体已被某个其他线程修改。在这种情况下,更新/合并因乐观锁定异常而失败。

所以步骤将成为:

  • 按ID
  • 查找Hibernate对象
  • 设置新的/修改后的值,包括版本
  • 更新/合并/持续

当然,您需要确保您的实体关系具有适当的级联,或者为每个相关的实体关系逐个更新实体。