【问题标题】:JPA2: create-or-extend-tables is not extending existing table with new columnJPA2:create-or-extend-tables 未使用新列扩展现有表
【发布时间】:2015-01-02 16:14:56
【问题描述】:

我正在使用JPA2EclipseLink。我正在尝试向现有数据库和表添加一个新列。我在 POJO 类 MyTable 中添加了一个新字段。尽管有create-or-extend-tables 属性,但新列没有被添加。

这是我的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="idpersistance">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

<class>com.id.service.db.pojo.AppTable</class>
<class>com.id.service.db.pojo.MyTable</class>

<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"></property>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:2705/mydb"></property>
<property name="javax.persistence.jdbc.user" value="user"></property>
<property name="javax.persistence.jdbc.password" value="password"></property>

<property name="eclipselink.ddl-generation" value="create-or-extend-tables" /> 
<property name="eclipselink.ddl-generation.output-mode" value="database" />
<property name="eclipselink.id-validation" value="NULL"></property>
<property name="eclipselink.logging.level" value="FINE"/>
<property name="javax.persistence.lock.timeout" value="1000"/>
<property name="eclipselink.target-database" value="MySQL"/>

</properties>

</persistence-unit>
</persistence>

我不确定为什么没有添加新列。我回来了以下错误:

 Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException
 Internal Exception: java.sql.SQLException: null,  message from server: "Unknown column 'newcol' in 'field list'"
 Error Code: 1054

我正在使用的jar 文件:

 eclipselink.jar (2.5.2)
 javax.persistence_2.1.0.v201304241213.jar

如果我的persistence.xml 文件中缺少任何内容,请告诉我。

感谢任何帮助。

更新: 我已经调试到EclipseLink 代码,发现它没有尝试生成新列,它在EntityManagerFactoryProvider 类中的extendDefaultTables() 方法处引发错误,并说表已经存在并从该方法返回。

如果我手动将此字段设置为true,则DatasourceAccessor 类的incrementCallCount() 方法中有一个名为useExternalConnectionPooling 的字段。然后新列正在成功生成。由于该字段为 false,EclipseLink 未触发扩展。我不确定,这是否是正确的字段。

【问题讨论】:

  • 这对我不起作用。我仍然看到同样的问题。
  • 创建表的 SQL 显示了什么?
  • @Chris,我没有明白你的意思。表已经创建,现在我正在尝试添加新列。
  • 您解决了这个问题吗?我对 eclipselink 2.7.0 也有同样的问题。

标签: java mysql eclipselink jpa-2.0


【解决方案1】:

eclipselink.logging.level.sql 设置为 FINE,1) 通过调整配置文件,或 2) 以编程方式:

Map<String, Object> x = new HashMap<>();
...
x.put("eclipselink.logging.level.sql", "FINE");
...
Persistence.createEntityManagerFactory("MyPersistenceUnit", x);

然后您将获得 SQL 日志,您可以在其中找到如下语句:ALTER TABLE myTab ADD myColumn ...

[EL Fine]: sql: 2015-11-11 16:24:14.042--ServerSession(667237426)--Connection(1844518545)--ALTER TABLE bm_picinfo ADD account BIGINT NOT NULL 
[EL Fine]: sql: 2015-11-11 16:24:14.066--ServerSession(667237426)--SELECT 1
[EL Warning]: 2015-11-11 16:24:14.092--ServerSession(667237426)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.0.v20150309-bf26070): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERROR: column "account" contains null values

在上面的例子中,新字段被定义为

   @ManyToOne(targetEntity = BmAccountE.class)
   @JoinColumn(name = "account", nullable = false, insertable = false, updatable = false)
   public BmAccountE account;

在这种情况下,删除nullable = false 是解决方案。

【讨论】:

    猜你喜欢
    • 2013-06-24
    • 2018-07-09
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 2012-08-11
    • 2011-05-07
    • 1970-01-01
    • 2018-10-08
    相关资源
    最近更新 更多