【问题标题】:Hibernate annotation Cascade problemHibernate注解级联问题
【发布时间】:2011-07-07 10:22:43
【问题描述】:

我有一个 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;
}

}

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

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

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

  • 坚持
  • 合并
  • 删除
  • 刷新
  • 删除
  • SAVE_UPDATE
  • 复制
  • DELETE_ORPHAN
  • 锁定
  • EVICT

巴特

【问题讨论】:

    标签: java hibernate annotations cascade constraints


    【解决方案1】:

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

    【讨论】:

    • 好的,我明白你(和 justYo)在说什么,但这里有另一个问题:我们所有的操作都是在标记为 @Transactional 的方法中完成的。
    • 我的最后一条评论不完整:这是全文:我们所有的操作都是在标记为@Transactional 的方法中完成的,这意味着所有这些语句(将酒店列表设置为空、保存、删除) 将在方法完成后执行。所以,它仍然抛出同样的错误。
    • 尝试检查 Hibernate 生成的 SQL 查询,并查看连接表上的删除是否出现在国家表上的删除之前。不要将列表设置为空,清除它,只有在删除酒店后。如果它仍然不起作用,请尝试在调用 clear 之后和调用 delete 之前刷新会话。
    【解决方案2】:

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

    Hibernate 有一个future request 来支持它。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 感谢您的信息,但我们的应用程序应该是可移植的,因此我们希望尽量减少特定于数据库的内容。
      猜你喜欢
      • 2011-12-31
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      相关资源
      最近更新 更多