Hibernate注释级联问题

时间:2011-07-07 10:22:43

标签: java hibernate annotations cascade constraints

我有一个包含另一个类列表的Java类。

@Entity public class Country {


private Long id;
private List<Hotel> hotels;

public void setId(Long id) {
this.id = id;
}

@Id 
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="COUNTRY_SEQ")
@SequenceGenerator(name="COUNTRY_SEQ", sequenceName="COUNTRY_SEQ", allocationSize=1)
public Long getId() {
return id;
}

public void setHotels(List<Hotel> hotels) {
this.hotels = hotels;
}

@OneToMany
@JoinTable(
    name="COUNTRY_HOTELS",
    joinColumns=@JoinColumn(name="COUNTRY_ID"),
    inverseJoinColumns=@JoinColumn(name="HOTEL_ID")
)
public List<Hotel> getHotels() {
return hotels;
}

}

当我尝试删除国家/地区时,我得到&#34; ORA-02292:违反完整性约束(HOT.fk1a1e72aaf2b226a) - 找到子记录&#34;因为当其子女(=酒店)仍然存在时,它不能删除国家。

但是,这样就好了!删除国家/地区时,我不想删除我的酒店。

我尝试了没有任何@ Cascade-annotation但它失败了。我也试过SAVE_UPDATE,但仍然失败了。 那么我需要@ Cascade-annotation(还是有其他解决方案?):

  • PERSIST
  • MERGE
  • 删除
  • REFRESH
  • DELETE
  • SAVE_UPDATE
  • REPLICATE
  • DELETE_ORPHAN
  • LOCK
  • EVICT

巴特

3 个答案:

答案 0 :(得分:0)

在删除国家/地区之前,您必须从该国家/地区的酒店列表中删除酒店,以便告知Hibernate酒店不再有国家/地区。

答案 1 :(得分:0)

不幸的是,Hibernate还不支持ON DELETE SET NULL类型的级联。 因此,您必须先手动删除引用,然后才删除子实体。

Hibernate有future request支持它。

答案 2 :(得分:0)

看起来您使用的是Oracle。它允许您通过使用COUNTRY_IDhttp://www.techonthenet.com/oracle/foreign_keys/foreign_delete.php)定义外键ON DELETE CASCADE来在数据库级别实现级联删除。