我们有一个带有嵌入式集合的实体。
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)添加@ uniqueconconstraint
我尝试使用@ uniqueconconstraint来缓解这种情况,它应该处理这种情况
@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 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.
我如何使一个2配置工作,使用标准JPA 2.0 ?我需要一些额外的注释除了@UniqueConstraint在@CollectionTable?
如果你使用可嵌入类型,你不能/不应该在Set上使用@AttributeOverrides,然后将可嵌入类型中的Column设置为Nullable?
@AttributeOverrides({
@AttributeOverride(name="UNIQUE_COLUMN", column=@Column(name="UNIQUE"))
@Column(name = "UNIQUE", nullable = true)