如何让Hibernate生成“null”而不是将列值绑定为null

时间:2011-02-22 14:38:51

标签: hibernate

有没有办法让hibernate通过使用“is null”来生成sql查询,除了将值绑定到null之外?我正在使用DB2,我在下面解释了详细信息:

在我的项目中,我使用以下持久化类映射到数据库表(我使用ElementCollection映射A实例中的B实例集合):

@Entity
@Table(name = "A")
public class A implement Serializable {
   @Id
   @Colum(name = "A_A")
   private a_A;

   @ElementCollection(fetch = FetchType.EAGER)
   @JoinTable(name = "B", joinColumns = @JoinColumn(name = "B_A", nullable = false))
   @Fetch(FetchMode.SUBSELECT)
   private Set<B> A_Bs = new HashSet<B>();;
   ....
}

@Embeddable
@Table(name = "B")
@Access(AccessType.FIELD)
public class B implements Serializable {
   @Column(name B_C)
   private String C;

   @Column(name B_D)
   private String D;

.....
}

当我尝试更新A的实体实例时,我可以看到自己生成的以下sqls Hibernate(因为B中没有id定义,所以在一般情况下只是盲目地更新集合是有意义的):< / p>

delete from B where B_A=? and B_C=? and B_D=? 
insert into B (B_A, B_C, B_D) values (?, ?, ?)

问题是B_C和B_D可以为空,B_D是另一个表(对象)的外键。

因此,如果B_C或B_D的原始值为null,则删除sql将变为:

delete from B where B_A=<somevalue> and B_C=null and B_D=null
在DB2中,如果你有“= null”,DB2就不会删除任何行,最后第二次插入查询将失败。但在我的应用程序中,我必须将null作为值放到B_C或B_D,所以我希望hibernate生成这样的查询:

delete from B where B_A=? and (B_C is null or B_C=?) and (B_D is null or B_D=?)

有办法做到这一点吗?

请帮助。非常感谢。

1 个答案:

答案 0 :(得分:2)

为什么不规范你的模式,使B成为自己的实体,在B中放置代理主键,并在A和B之间建立OneToMany关系?

这样效率会更高(每次更新集合时无需删除所有内容并重新插入),您将不再遇到这些问题。