Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA2.0/Hibernate:为什么JPA会激发查询来更新所有列的值,即使托管bean的某些状态发生了更改?_Hibernate_Jpa 2.0 - Fatal编程技术网

JPA2.0/Hibernate:为什么JPA会激发查询来更新所有列的值,即使托管bean的某些状态发生了更改?

JPA2.0/Hibernate:为什么JPA会激发查询来更新所有列的值,即使托管bean的某些状态发生了更改?,hibernate,jpa-2.0,Hibernate,Jpa 2.0,我将JPA2.0与Hibernate一起使用 例如,下表中有JPA实体: User [userId, userName, userAddress] 我可以使用find()方法获取用户实体: 现在,如果我在上面获取的同一用户实体上更改任何用户的状态(比如用户名): user.setUserName("Narendra"); 并使用merge()方法执行合并: 通过以下查询成功执行合并,该查询在合并时由JPA/hibernate触发: Hibernate: update User set USE

我将JPA2.0与Hibernate一起使用

例如,下表中有JPA实体:

User [userId, userName, userAddress]
我可以使用find()方法获取用户实体:

现在,如果我在上面获取的同一用户实体上更改任何用户的状态(比如用户名):

user.setUserName("Narendra");
并使用merge()方法执行合并:

通过以下查询成功执行合并,该查询在合并时由JPA/hibernate触发:

Hibernate: update User set USERID =?, USERNAME=?, USERADDRESS=? where USERID=?
这里我的问题是,如果我只更改了用户实体中的用户名状态,我没有更改userId、userAddress等。JPA应该在下面的查询(只是更改用户名)而不是上面的查询中触发

 Hibernate: update User set USERNAME=? where USERID=?
有什么想法吗

查看该属性

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

考虑到动态更新可能会对性能产生一些影响。使用它会带来一点开销,如果没有一个包含大量不太可能修改的列的大型(可能是遗留)表,那么可能会适得其反。看这个相关的问题

冬眠<4.0 如果您使用的是Hibernate注释,请将特定于Hibernate的注释与以下注释一起使用:

如果您使用的是XML映射:

<class name="User" table="user" dynamic-update="true">

休眠>=4.0
特定于Hibernate的@Entity注释在Hibernate 4.0中已被弃用,并计划在4.1中消失。使用动态更新的正确方法是使用now注释实体(感谢@Tiny的提醒)。

也可用作注释:

import org.hibernate.annotations.DynamicUpdate;

@Entity
@DynamicUpdate
@Table(name = "payments")
public class Payment {
    ...
}

谢谢你的回复。我尝试了这个解决方案,效果很好。但是,我关心的是在所有定义为JPA实体的实体中添加特定于hibernate的属性。有没有办法在persistence.xml中配置一些东西,以便每个实体都可以使用此配置插入?有一个有趣的问题与此主题相关:。无法在
persistence.xml
中定义此行为,因为它是特定于Hibernate的。也许您可以尝试使用特定的hibernate配置文件和
persistence.xml
,或者在启动侦听器中使用某种运行时字节码操作,在运行时将hibernate
@Entity
注释添加到所有映射的类中。记住接受你问题的正确答案。是的,我知道了。最后但并非最不重要的是,我接受了你的回答。Thanks@Tiny谢谢,在答案上加了一条注释(也谢谢你告诉我,我还不知道:-)
@org.hibernate.annotations.Entity(dynamicUpdate = true)
<class name="User" table="user" dynamic-update="true">
import org.hibernate.annotations.DynamicUpdate;

@Entity
@DynamicUpdate
@Table(name = "payments")
public class Payment {
    ...
}