@UniqueConstraint不影响@CollectionTable Hibernate上的DELETE语句

时间:2013-05-22 07:07:47

标签: java hibernate jpa orm

我们有一个嵌入式集合的实体。

1)初始配置

@Entity @Table
public class A implements Serializable { 
    @ElementCollection
    @CollectionTable(name = "A_B", joinColumns = @JoinColumn(name = "A"))
    private Set<B> embedded = new HashSet<B>();
}

@Embeddable
public class B implements Serializable {
    private String unique;
    private String nullable;
}

使用此配置删除对象时,Hibernate会生成类似于

的查询
DELETE FROM A_B WHERE A = ? AND unique = ? AND nullable = ?

当nullable字段实际为NULL时,由于SQL NULL等于。

,这不起作用

2)添加@UniqueConstraint

我试图使用@UniqueConstraint缓解这个问题,假设要处理这种情况

@Entity @Table
public class A implements Serializable { 
    @ElementCollection
    @CollectionTable(name = "A_B", joinColumns = @JoinColumn(name = "A"), uniqueConstraints = @UniqueConstraint(columnNames = {"unique"}))
    private Set<B> embedded = new HashSet<B>();
}

这根本不会改变查询。

最后我通过使用propriatery Hibernate @SQLDelete annotation

来解决它

3)添加@SQLDelete

@Entity @Table
public class A implements Serializable { 
    @ElementCollection
    @CollectionTable(name = "A_B", joinColumns = @JoinColumn(name = "A"), uniqueConstraints = @UniqueConstraint(columnNames = {"unique"}))
@SQLDelete(sql = "delete from A_B where A=? and unique=? and (1 = 1 OR nullable = ?)")

    private Set<B> embedded = new HashSet<B>();
}

我有严格的要求只使用JPA 2.0注释,所以我可能需要删除我的解决方案 - 3.

如何使用标准JPA 2.0进行2配置工作? 除了@CollectionTable中的@UniqueConstraint,我还需要一些额外的注释吗?

1 个答案:

答案 0 :(得分:0)

如果您使用的是Embeddable类型,则不能/不应该在Set上使用@AttributeOverrides,然后将embeddable类型中的Column设置为Nullable?

  @AttributeOverrides({
  @AttributeOverride(name="UNIQUE_COLUMN", column=@Column(name="UNIQUE"))

  @Column(name = "UNIQUE", nullable = true)