【问题标题】:Why has Hibernate created join table that prevents me emptying contents of table为什么 Hibernate 创建了阻止我清空表内容的连接表
【发布时间】:2019-04-01 16:35:46
【问题描述】:

我有三个 Hibernate 实体:

  • 封面艺术
  • 歌曲

Song 表示歌曲文件(例如 mp3 文件), 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_4B4O39V3RSF1IWRRIX6QQQTLK: PUBLIC.SONG_COVERART 外键(SONG_RECNO)参考 PUBLIC.SONG(RECNO) (1)"; SQL 语句:

所以不可能清空表,CoverArt 实体仅作为歌曲的一部分存在,所以我认为它们只是从 COVER_ART 表到 SONG 表的外键,并希望我可以删除所有内容CoverArt 没有问题,但是创建了一个临时表 SONG_COVERART,它具有两个表的外键以防止删除。

我做错了什么(使用 Hibernate 4.3.11)

【问题讨论】:

  • 可能是因为在您的代码的先前版本中没有 JoinColumn 注释,因此 Hibernate 为此关联创建了一个连接表,您填写了该连接表,但忘记删除。
  • @JBNizet 我认为你有它,因为我自己没有看到错误,只有一些客户和我刚刚打开 hibernate.show_sql 并重新创建数据库并且没有 SONG_COVERART 表,如果你想发布我将标记为正确的答案。
  • @JBNizet 啊,所以用 Configuration config = getInitializedConfiguration() 重新创建数据库; config.setProperty(Environment.HBM2DDL_AUTO, "create");不会解决问题,因为麻烦的表仍然存在,因为 Hibernate 不再知道它,我只是手动添加 SQL 删除语句?
  • 我永远不会使用 hbm2ddl 来处理包含数据的实际生产数据库。快速原型设计很好,但不能维护一个包含必须正确迁移的数据的实际数据库。 FlywayDB 和 Liquibase 是更好的工具。
  • @JBNizet 我会看看,但这只是一个应用程序数据库,通常一次不需要持续超过几周,请确认我将不得不做一个分开滴

标签: java hibernate


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    相关资源
    最近更新 更多