0

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

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 = ?

这不起作用,当可空字段实际上是 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>();
}

这根本没有改变查询。

最后我通过使用专有的 Hibernate @SQLDelete 注释解决了它

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,我还需要一些额外的注释吗?

4

1 回答 1

0

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

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

  @Column(name = "UNIQUE", nullable = true)
于 2013-05-22T07:29:36.330 回答