在开发JPA应用程序期间,我向实体添加了一个字段“type”。这导致应用程序无法以
开头Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.2.v20100323-r6872): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: Column 'T1.TYPE' is either not in any table in the FROM list or appears within a join specification and is outside the scope of the join specification or appears in a HAVING clause and is not in the GROUP BY list. If this is a CREATE or ALTER TABLE statement then 'T1.TYPE' is not a column in the target table.
Error Code: -1
选择期间。
有没有办法在启动时将它转到ALTER TABLE,以匹配当前的实体定义? 我注意到,当应用程序启动时,它会为每个表调用CREATE TABLE,失败并继续。
过去当我向实体添加字段时,我只是删除了数据库并重新开始。现在这对我来说还不错,但如果我想在开发软件的下一个版本时为某个条目添加一个字段,如何在不丢失所有数据的情况下升级我的客户端呢?
提前致谢 - 菲尔。
答案 0 :(得分:11)
一般来说,JPA提供程序的数据库生成器对于创建和更新生产数据库是不可靠的。假设在版本1中,您的name
实体有一个名为User
的字段,而在版本2中,您将其替换为firstName
和lastName
。在这种情况下,数据库生成器无法正确迁移您的架构。
换句话说,JPA提供程序的自动数据库生成仅对开发有用,而不适用于生产。
相反,您可以考虑使用LiquiBase等数据库迁移工具。
尽管如此,虽然EclipseLink不支持使用eclipselink.ddl-generation
属性更新而不是重新创建表的方法,但其他一些JPA提供程序(例如Hibernate)支持更新数据库表。但是,它们不能用于生产用途,因为它们在给定示例的情况下失败。
答案 1 :(得分:4)
您可以使用
替换EclipseLink中的表“eclipselink.ddl-generation”=“drop-and-create-tables”
EclipseLink不支持更改现有表,请为此记录增强请求并投票。
通常,让DBA定义脚本来定义生产模式并处理迁移通常会更好。
答案 2 :(得分:1)
作为参考,如果您对DataNucleus执行了相同的操作并为新字段(列)指定了默认值,并且您已将相关的持久性属性设置为允许架构更新,那么它将发出“ALTER TABLE ADD COLUMN ... “没关系。
答案 3 :(得分:1)
您是否将它与JSF一起使用?
非常容易。持久性单元(persistence.xml)可以为您删除并创建表。
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="JobbingPU" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>job</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
</properties>
</persistence-unit>
</persistence>