如何更新未完全填写的对象/实体?

时间:2012-01-18 22:43:14

标签: spring jpa

我有一个包含多个字段的实体,但在一个视图中我只想编辑其中一个字段。例如...我有一个用户实体,用户拥有,id,名称,地址,用户名,密码等等。在其中一个视图我希望能够改变pwd(只有pwd)。所以视图只知道id并发送pwd。我想更新我的实体而不加载其余的字段(还有很多)并更改一个pwd字段然后将它们全部保存回数据库。有没有人试过这个。或者知道我在哪里可以看。非常感谢所有的帮助。

提前谢谢。

PS 我应该给出更多细节。我正在使用hibernate,roo正在创建我的实体。我同意每个视图应该有自己的实体,问题是,我只构建控制器,一切都在以前完成。我们是来自服务层的发现者,但是我们想要使用其他一些查找器,它们似乎无法通过服务层访问,因此决定吹走服务层并直接与实体交互(通过查找程序) ,UserService.update(user)不再是一种选择。我最近发现了一个User.persist()和一个User.merge(),合并是否更新了对象上的所有字段,或者仅更新了非空的字段,或者如果我想要一个现在为null,它将如何知道区别?

3 个答案:

答案 0 :(得分:2)

您使用的是除Spring以外的哪些技术?

首先,每个视图都有单独的DTO,仅根据需要进行剥离。一个DTO用于id +密码,另一个用于地址数据等。请记住,DTO可以相互继承,因此可以避免重复。永远不要直接传递业务/ ORM实体来查看。它风险太大,某些框架中的泄漏可能允许用户修改您不想要的字段。

在DTO从视图中返回后(大多数Web框架都像这样工作)只需加载整个实体并仅填充DTO中存在的字段。

但这似乎是困扰你的持久性。假设您正在使用Hibernate,您可以利用dynamic-update设置:

  

dynamic-update(可选 - 默认为false):指定应在运行时生成UPDATE SQL,并且只能包含值已更改的列。

在这种情况下,您仍然将整个实体加载到内存中,但Hibernate将生成尽可能小的UPDATE,包括仅包含已修改的( dirty )字段。

另一种方法是为每个用例/视图分别设置实体。所以你将拥有一个只有id和密码的实体,只有地址数据的实体等等。所有这些实体都映射到同一个表,但是映射到不同的列子集。这很容易变得一团糟,应该作为最后的手段。

答案 1 :(得分:0)

请参阅hibernate参考here

对于persist()

persist() makes a transient instance persistent. However, it does not guarantee that the 
identifier value will be assigned to the persistent instance immediately, the assignment 
might happen at flush time. persist() also guarantees that it will not execute an INSERT
statement if it is called outside of transaction boundaries. This is useful in long-running 
conversations with an extended Session/persistence context.

合并

if there is a persistent instance with the same identifier currently associated with the session, copy the state of the given object onto the persistent instance

if there is no persistent instance currently associated with the session, try to load it from the database, or create a new persistent instance

the persistent instance is returned

the given instance does not become associated with the session, it remains detached

persist()和merge()与列被修改的事实无关。使用动态更新为@Tomasz Nurkiewicz建议仅保存修改的列。使用dynamic-insert插入not null专栏。

答案 2 :(得分:0)

某些JPA提供程序(如EclipseLink)支持提取组。因此,您可以加载部分实例并进行更新。

请参阅, http://wiki.eclipse.org/EclipseLink/Examples/JPA/AttributeGroup