繁体   English   中英

Hibernate标注级联问题

[英]Hibernate annotation Cascade problem

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

@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;
}

}

当我尝试删除国家/地区时,我得到“ORA-02292:违反完整性约束(HOT.fk1a1e72aaf2b226a) - 找到子记录”,因为当其子项(=Hotels)仍然存在时,它无法删除国家/地区。

然而,它是这样的。 我不想在删除国家/地区时删除我的酒店。

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

  • 坚持
  • 合并
  • 消除
  • 刷新
  • 删除
  • SAVE_UPDATE
  • 复制
  • DELETE_ORPHAN
  • 驱逐

巴特

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

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

未来会要求Hibernate 支持它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM