【发布时间】:2014-06-03 15:44:24
【问题描述】:
我只想将那些未使用的属性从数据库中删除(orphanRemoval=true)。 我得到的是它首先尝试更新参考 PRODUCT_ID 然后删除它。但由于引用是密钥的一部分,它不能。
家长:
@Entity
@Table(name = "STYLE")
public class Style implements IterableById, Serializable {
...
@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, orphanRemoval=true)
@JoinColumn(name="PRODUCT_ID", referencedColumnName = "PRODUCT_ID")
private List<Attribute> attributes;
...
它的孩子
@Entity
@Table(name="ATTRIBUTE")
public class Attribute{
@EmbeddedId
private Id id;
...
@Embeddable
public static class Id implements Serializable{
private static final long serialVersionUID = -8631874888098769584L;
@Column(name="PRODUCT_ID")
protected Long productId;
@Column(name="NAME")
protected String name;
@Column(name="COUNTRY_CODE")
protected String countryCode;
...
在我获取属性列表并清除之后,然后尝试提交我得到
...
Hibernate: update ATTRIBUTE set PRODUCT_ID=null where PRODUCT_ID=?
Hibernate: delete from ATTRIBUTE where COUNTRY_CODE=? and NAME=? and PRODUCT_ID=?
javax.persistence.RollbackException: Error while committing the transaction
Caused by: javax.persistence.OptimisticLockException: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
...
有谁知道为什么 Hibernate 会先尝试更新引用,然后再删除它。我能以某种方式阻止它。我想要的是那些不使用的孩子(属性)必须被删除,而不仅仅是削减参考。 ...
【问题讨论】: