13

我正在将 JPA2.0 与 Hibernate 一起使用。

例如,我有下表的 JPA 实体:

User [userId, userName, userAddress]

我可以使用 find() 方法获取用户实体:

User user = entityManager.find(User.class , 1L); // 1L is user id

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

user.setUserName("Narendra");

并使用 merge() 方法执行合并:

entityManager.merge(user);

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

Hibernate: update User set USERID =?, USERNAME=?, USERADDRESS=? where USERID=?

我的问题是,如果我只更改了用户实体中的用户名状态,我没有更改 userId、userAddress 等。JPA 应该在查询下方触发(只是为了更改 userName)而不是在查询上方触发。

 Hibernate: update User set USERNAME=? where USERID=?

有什么想法吗?

4

2 回答 2

12

查看dynamic-update物业。

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

考虑到动态更新可能会对性能产生一些影响。使用它会产生一些开销,如果您没有一个包含许多不太可能修改的列的大型(可能是遗留)表,它可能会适得其反。请参阅此相关问题Hibernate:dynamic-update dynamic-insert-Performance Effects

休眠 < 4.0

如果您使用的是 Hibernate Annotations,请使用 Hibernate 特定的@Entity注释和JPA注释:

@org.hibernate.annotations.Entity(dynamicUpdate = true)

如果您使用 XML 映射:

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

休眠 >= 4.0

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

于 2013-04-02T09:48:06.163 回答
2

也可以用作注解:

import org.hibernate.annotations.DynamicUpdate;

@Entity
@DynamicUpdate
@Table(name = "payments")
public class Payment {
    ...
}
于 2016-11-09T06:28:32.143 回答