JPA EclipseLink表创建顺序

时间:2013-03-03 08:43:24

标签: jpa eclipselink

我有一个使用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>

(其他因为没关系,否则就省略了=&gt;它一般都在工作)

问题在于,当我生成表格时,我收到错误:

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

(实体类定义了表名: @实体 @Table(name =“DIFFICULTY”))

如果我从persistence.xml中注释掉'Options',那么'DIFFICULTY'表就会被创建好了。然后再次取消注释“选项”并重新生成表格=&gt; 'OPTIONS'表也将被创建(选项有@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;

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

成功创建了Difficulty和Options表后,我能够重新创建其余的数据库表。

  1. 问题是我应该(能够)指定创建表的顺序吗?
  2. @ManyToOne协会有什么问题吗?
  3. 已经花了几个小时来解决这个问题,但无法弄清楚问题是什么。

    对于长篇文章感到抱歉,我只想解释整个情况。 上次我收到'tl;博士;”回答(当时不知道是什么意思),我花了6个小时看错了,所以请不要在这种情况下回答。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

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

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