JPA EclipseLink表创建顺序
我有一个正在工作的项目,它使用JPA在MySQL上持久化数据(EclipseLink作为提供者)。最近,我想通过Eclipse=>EclipseLink“从实体生成表”删除数据库并使用表再次创建它。我还更新了persistence.xml(首先自动生成,然后手动修改以缩小此问题的范围) (实体类定义了表名: @实体 @表(name=“难度”)) 如果我从persistence.xml中注释掉“Options”,那么“难点”表就可以创建了。然后再次取消对“Options”的注释并重新生成表=>也将创建“Options”表(Options具有@manytone关联,难度很大) 在persistence.xml中JPA EclipseLink表创建顺序,jpa,eclipselink,Jpa,Eclipselink,我有一个正在工作的项目,它使用JPA在MySQL上持久化数据(EclipseLink作为提供者)。最近,我想通过Eclipse=>EclipseLink“从实体生成表”删除数据库并使用表再次创建它。我还更新了persistence.xml(首先自动生成,然后手动修改以缩小此问题的范围) (实体类定义了表名: @实体 @表(name=“难度”)) 如果我从persistence.xml中注释掉“Options”,那么“难点”表就可以创建了。然后再次取消对“Options”的注释并重新生成表=>也将
<property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
(许多选项被认为具有相同的选择难度,因此没有一个选项真正具有相同的难度。我希望这是正确的?)
在成功创建了难度和选项表之后,我能够重新创建其余的数据库表
上次我收到“tl”;博士答案(当时我不知道这是什么意思),我花了6个小时寻找错误的东西,所以在这种情况下请不要费心回答。您是否在上次创建之间更改了类/模式?可能是您添加或删除了新的关系,因此EclipseLink无法删除旧的约束 对于drop和create tables,EclipseLink将基本上执行以下操作:
- 删除已知约束
- 删除已知表
- 创建已知表
- 创建已知约束
在最新版本中,EclipseLink将尝试几次删除过程来尝试和处理未知的约束,但快速变化的开发模式的最佳方法是在两次部署之间删除整个模式。如果查看异常堆栈,您将看到它来自实体的默认构造函数。此构造函数试图通过获取entitymanager来发出查询,但由于所需的表尚不存在而失败。当您创建一个表时,构造函数可以查询它,这允许一切继续进行
默认构造函数中不应包含业务逻辑。这由提供程序使用,并在DDL之前的部署期间被调用。删除将解决此问题。是否可以发布完整的错误和堆栈?create语句有什么问题?下面是完整的堆栈跟踪。抱歉耽搁了。无法更早地获得它。约束的问题听起来似乎有道理,但问题是我在创建全新数据库(创建空数据库+用户)之前删除了整个数据库。我想看到,当db还不存在时,它可以从头开始创建(当这个游戏第一次运行时的情况)。我希望在这种情况下创建工作会很容易,但是却出现了这个错误(因为其他所有内容都被注释掉了,所以只需要创建两个表),我必须检查“drop database”是否足够。如果没有使用“drop db”,可能我需要单独删除模式?嗯,测试速度很快。在“drop database xxx”之后,我运行了“drop schema xxx”,得到了:错误1008(HY000):无法删除数据库“xxx”;数据库不存在创建“难度”表后,我将能够同时创建所有其他表。这就解释了。我试图让它更早地自动生成表(当时没有成功)。我想我已经删除了它,但无法从错误中找出它(显然还留下了一些东西)。
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'xxx.DIFFICULTY' doesn't exist
Error Code: 1146
<property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
@ManyToOne(optional = false, cascade = CascadeType.REFRESH, fetch = FetchType.LAZY)
private Difficulty difficulty = null;