我有三个休眠实体:
歌曲代表歌曲文件(例如mp3文件), CoverArt 包含歌曲Coverart,一首歌曲可以包含多首Coverart
在歌曲中,我将 CoverArt 的链接定义为:
@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.ALL})
@JoinColumn(name = "recNo")
private List<CoverArt> coverArts;
在 CoverArt 中,没有定义到 Song 的链接,我们只有
@Id
@GeneratedValue
private Integer id;
该应用程序运行正常,除非我要清空Song和CoverArt实体。
这种情况不会持续发生,但是如果我先尝试从 Song 中删除
e.g
String hql = String.format("delete from CoverArt");
Query query = session.createQuery(hql);
query.executeUpdate();
hql = String.format("delete from Song");
query = session.createQuery(hql);
query.executeUpdate();
session.getTransaction().commit();
我得到异常:
由以下原因引起:org.h2.jdbc.JdbcSQLException:引用完整性 约束违反:“ FK_CBUK1UQ1D0DQAA077XH16SRX2: PUBLIC.SONG_COVERART外键(COVERARTS_ID)参考 PUBLIC.COVERART(ID)(13)“; SQL语句:
如果我尝试另一种方法
String hql = String.format("delete from Song");
Query query = session.createQuery(hql);
query.executeUpdate();
hql = String.format("delete from CoverArt");
query = session.createQuery(hql);
query.executeUpdate();
我得到例外
由以下原因引起:org.h2.jdbc.JdbcSQLException:引用完整性 约束违反:“ FK_4B4O39V3RSF1IWWRIX6QQQTLK: PUBLIC.SONG_COVERART外键(SONG_RECNO)参考 PUBLIC.SONG(RECNO)(1)“; SQL语句:
因此不可能清空表, CoverArt 实体仅作为Song的一部分存在,因此我认为它们只是从COVER_ART表到SONG表的外键,并且期望我可以删除所有内容完全可以从 CoverArt 中获取,但是创建了一个临时表SONG_COVERART,该临时表具有指向两个表的外键,可以防止删除。
我在做什么错(使用Hibernate 4.3.11)
答案 0 :(得分:1)
可能是因为在先前版本的代码中没有JoinColumn批注,因此Hibernate为该关联创建了一个联接表,您已填写该联接表,但忘记删除了。