2014-11-06 45 views
3

我正在使用JPA2,EclipseLink。我正在嘗試向現有數據庫和表中添加一個新列。我在POJO類MyTable中添加了一個新字段。儘管有create-or-extend-tables屬性,新列沒有得到加起來。JPA2: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未觸發擴展。我不確定,如果這是正確的領域。

+0

請參閱http://stackoverflow.com/questions/13372213/eclipselink-create-or-extend-tables-not-working-unknown-column – 2014-11-06 08:42:09

+0

這並不適用於我。我仍然看到同樣的問題。 – User12111111 2014-11-06 09:46:23

+0

表創建的SQL顯示什麼? – Chris 2014-11-06 14:59:31

回答

0

設置eclipselink.logging.level.sqlFINE,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