我正在使用 JPA2
、EclipseLink
。我正在尝试向现有数据库和表中添加一个新列。我在 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()
方法中抛出错误类并说表已经存在并从该方法返回。
在 DatasourceAccessor
类的 incrementCallCount()
方法中有一个名为 useExternalConnectionPooling
的字段,如果我手动将此字段设置为 true。然后成功生成新列。由于该字段为假,EclipseLink
未触发扩展。我不确定这是否是正确的字段。
最佳答案
将 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
。
关于java - JPA2 : create-or-extend-tables is not extending existing table with new column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26774684/