我有三个休眠实体:


封面艺术
歌曲


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

09-11 19:30