为什么Hibernate创建了连接表,阻止我清空表的内容



我有三个休眠实体:

  • 封面艺术

歌曲代表歌曲文件(例如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 为此关联创建了一个连接表,您填写了该表,但忘记删除。

最新更新