为什么Hibernate创建了联接表以防止我清空表的内容

时间:2019-04-01 16:35:46

标签: java hibernate

我有三个休眠实体:

  • CoverArt
  • 歌曲

歌曲代表歌曲文件(例如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)

1 个答案:

答案 0 :(得分:1)

可能是因为在先前版本的代码中没有JoinColumn批注,因此Hibernate为该关联创建了一个联接表,您已填写该联接表,但忘记删除了。