我有三个休眠实体:
- 封面艺术
- 歌
歌曲代表歌曲文件(例如mp3文件), 封面艺术包含歌曲封面,一首歌曲可以有多个封面艺术
在Song中,我将封面艺术的链接定义为:
@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.ALL})
@JoinColumn(name = "recNo")
private List<CoverArt> coverArts;
在封面艺术中,没有定义与歌曲的链接,我们只有
@Id
@GeneratedValue
private Integer id;
该应用程序运行正常,除非我想清空歌曲和封面实体。
它不会始终如一地发生,但如果我先尝试从歌曲中删除
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: Referential integrity 约束冲突:"FK_CBUK1UQ1D0DQAA077XH16SRX2: 公共。SONG_COVERART 外键(COVERARTS_ID)引用 公共。封面艺术(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: Referential integrity 约束冲突:"FK_4B4O39V3RSF1IWWRIX6QQQTLK: 公共。SONG_COVERART 外键(SONG_RECNO)引用 公共。歌曲(1)";SQL语句:
所以不可能清空表,CoverArt 实体仅作为 Song 的一部分存在,因此我认为它们只是从 COVER_ART 表到 SONG 表的外键,并期望我可以毫无问题地从CoverArt中删除所有内容,但是有一个临时表创建SONG_COVERART其中包含两个表的外键以防止删除。
我做错了什么(使用Hibernate 4.3.11)
可能是因为在以前版本的代码中没有 JoinColumn 注释,因此 Hibernate 为此关联创建了一个连接表,您填写了该表,但忘记删除。