我试图以某种方式使用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(实体);
每个属性都会更新,但不仅仅是我已设置的属性。
问题出在哪里?
答案 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)。