我有三个休眠实体:
封面艺术
歌曲
歌曲代表歌曲文件(例如mp3文件),
CoverArt包含歌曲Coverart,一首歌曲可以包含多个Coverart
在Song中,我将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)
最佳答案
可能是因为在您的代码的先前版本中没有JoinColumn批注,因此Hibernate为该关联创建了一个联接表,您已填写该联接表,但忘记删除了。