我正在使用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
代码并发现它没有尝试生成新列,它在extendDefaultTables()
类中的EntityManagerFactoryProvider
方法抛出错误,并且表已经存在并从该方法返回。
如果我手动将此字段设置为true,则useExternalConnectionPooling
类的incrementCallCount()
方法中有一个名为DatasourceAccessor
的字段。然后成功生成新列。由于该字段为false,EclipseLink
不会触发扩展。我不确定,如果这是正确的领域。
答案 0 :(得分:0)
通过调整配置文件将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
是解决方案。