【问题标题】:JPA EclipseLink table creation orderJPA EclipseLink 表创建顺序
【发布时间】:2013-03-03 08:43:23
【问题描述】:

我有一个使用 JPA 将数据持久保存在 MySQL 上的工作项目(EclipseLink 作为提供者)。最近我想删除数据库并通过 Eclipse => EclipseLink '从实体生成表'使用表再次创建它。我还更新了 persistence.xml(首先自动生成,然后手动修改以缩小此问题的范围)。

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>xxx.entity.options.Difficulty</class>
<class>xxx.entity.options.Options</class>

(省略其余部分,因为其他情况都可以=>它一般都在工作)

问题是当我生成表格时出现错误:

Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'xxx.DIFFICULTY' doesn't exist
Error Code: 1146

(实体类定义了表名: @实体 @Table(name = "难度"))

如果我从persistence.xml 中注释掉'Options','DIFFICULTY' 表就可以正常创建。然后再次取消注释“选项”并重新生成表格 => 还将创建“选项”表格(选项与难度有 @ManyToOne 关联)。

在我的persistence.xml中

<property name="eclipselink.ddl-generation" value="drop-and-create-tables" />

因为我还在开发中。

在我的 Options 类中

@ManyToOne(optional = false, cascade = CascadeType.REFRESH, fetch = FetchType.LAZY)
private Difficulty difficulty = null;

(假设许多选项选择了相同的难度,所以没有一个真正拥有一个。我希望这是正确的?)

成功创建难度表和选项表后,我能够重新创建其余的数据库表。

  1. 问题是我应该(能够)指定创建表的顺序吗?
  2. @ManyToOne 关联有问题吗?

已经在这个问题上花费了几个小时,但无法弄清楚问题所在。

抱歉,文字太长了,我只是试着解释一下整个情况。 上次我收到 'tl;博士;'回答(当时不知道是什么意思),我花了 6 个小时寻找错误的东西,所以请不要在这种情况下回答。

【问题讨论】:

  • 你能发布完整的错误和堆栈吗? create语句有什么问题?
  • 这是完整的堆栈跟踪。 pastebin.com/Biz16Ux3 。抱歉耽搁了。没能早点拿到。

标签: jpa eclipselink


【解决方案1】:

如果您查看异常堆栈,您会发现它来自实体的默认构造函数。此构造函数试图通过获取实体管理器来发出查询,但由于它需要的表尚不存在而失败。当您创建一个表时,构造函数可以查询它,这允许一切继续进行。

默认构造函数中不应包含业务逻辑。这由提供程序使用,并在 DDL 之前的部署期间被调用。删除它会解决问题。

【讨论】:

  • 这就解释了。我试图让它更早地自动生成表格(当时没有成功)。以为我已将其删除,但无法从错误中弄清楚(显然留下了一些东西)。
【解决方案2】:

您是否在上次创建之间更改类/模式?可能是您添加或删除了新关系,因此 EclipseLink 无法删除旧约束。

对于 drop-and-create-tables EclipseLink 基本上会执行以下操作,

  • 删除已知约束
  • 删除已知表
  • 创建已知表
  • 创建已知约束

在最新版本中,EclipseLink 将尝试几个 drop pass 来尝试处理未知的约束,但对于快速变化的开发模式的最佳方法是在部署之间删除整个模式。

【讨论】:

  • 约束的问题听起来很合理,但问题是我在创建全新的数据库之前删除了整个数据库(创建空数据库 + 用户)。我想看看数据库可以在它不存在时从头开始创建(第一次运行这个游戏时的情况)。我希望在这种情况下很容易创建工作,但是却得到了这个错误(并且只有 2 个表要创建,因为其他所有内容都被注释掉了)
  • 我必须检查“删除数据库”是否足够。如果不使用“drop db”,也许我需要单独删除架构?
  • 嗯,测试很快。在'drop database xxx'之后,我运行'drop schema xxx'并得到:错误1008(HY000):无法删除数据库'xxx';数据库不存在
  • 创建 'DIFFICULTY' 表后,我将能够一次创建所有其他表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
  • 1970-01-01
  • 2011-02-13
  • 2013-12-20
  • 2012-08-08
  • 2014-12-11
  • 2014-06-29
相关资源
最近更新 更多