如何启用Hibernate @DynamicUpdate功能?

时间:2015-05-13 15:24:02

标签: hibernate jpa

我试图以某种方式使用hibernates动态更新功能来更新我的实体,但它不起作用。如果我的实体的任何属性为NULL,则此属性也会更新,但我不希望这样。

@Entity
@Table(name = "DOMAIN")
@DynamicUpdate
@SelectBeforeUpdate
public class Domain implements Serializable {
private static final long serialVersionUID = 1L;
     @Id
     @NotNull(message = "Domain name must be provided")
     @Size(min = 1, max = 255)
     @Column(name = "DOMAIN_NAME")
     private String domainName;
     @Size(max = 255)
     @Column(name = "SALUTATION")
     private String salutation;
     @Size(max = 64)
     @Column(name = "FIRST_NAME")
     private String firstName;
     @Size(max = 64)
     @Column(name = "LAST_NAME")
     private String lastName;

///rest of the properties are omitted

但是当我尝试用以下内容更新我的实体时:     entityManager.merge(实体);

每个属性都会更新,但不仅仅是我已设置的属性。

问题出在哪里?

1 个答案:

答案 0 :(得分:1)

DynamicUpdate不会忽略null属性。它动态生成更新语句,以便更新已更改的属性,而未更改的属性不是:

Foo foo = em.find(Foo.class, 1L);
foo.setBar("new value");
// leave foo.baz as it is
em.flush();

在上面的代码中,使用DynamicUpdate的更新查询看起来像

update foo set bar = 'new value' where id = 1

而不是

update foo set bar = 'new value', baz = 'current value' where id = 1

将实体的属性设置为null意味着无论您是否使用DynamicUpdate,都应将此实体的属性设置为null(并在数据库中保持为null)。