2014-01-22 106 views
6

首先解释上下文。我有通过JMS访问的后端Java(Spring/Hibernate)应用程序。我有通过Url访问的客户端应用程序(RESTfull)。我有一个拥有多个列表的复杂实体(大部分是懒惰的),并且这个实体是xy其他实体的组合。什么是安全更新hibernate实体的最佳方法?

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

我可以走线槽一切从客户喜欢传来:

  • 通过id来获取Hibernate对象的
  • 检查所不同的是
  • 设置新值
  • 更新

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

我希望我解释得很好。提前致谢!

+1

如果您有'id'。做save​​OrUpdate()'有什么问题? –

+0

问题是我没有全部信息。我没有有效的Hibernate对象状态。如果我有10个字段并只更改field1,我的对象将填充id和field1。其余的都是空的。如果我保存/更新,我将丢失所有其他数据。 –

+0

是的,我明白了。然后我担心,你正在做正确的步骤。 :P –

回答

2

从你的描述看来,你所遵循的步骤是正确的。第一个(获取对象)和最后一个(更新对象)步骤是不可避免的。您可以优化的唯一地方是检查/设置部分。为此,您可以编写一个通用方法,它接受两个对象并使用反射比较它们的变化。这样它可以再次使用。

以下是使用反射的示例code。将其更改为适合您的需要

+0

谢谢Sandeep,在我看来,这是唯一的方法。我已经实施了类似的东西。 –

0

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

所以步骤将成为:

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

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

+0

正如我所说的问题,主要的问题是,我没有所有的价值观,因为我从网址参数只有什么应该改变... –

+0

对不起,我误解了你的问题。我更新了我的答案以澄清。 –

相关问题