JPA2.0/Hibernate:为什么JPA会激发查询来更新所有列的值,即使托管bean的某些状态发生了更改?
我将JPA2.0与Hibernate一起使用 例如,下表中有JPA实体: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
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 {
...
}