我将 EclipseLink 2.4.1 与 Glassfish 和 MySQL 数据库一起用于持久化实体。
我向实体添加了一个字段,当我尝试保留该实体时,它说新字段是“未知”。
我们应该如何使用新的“创建或扩展表”功能?我原以为它会为这个字段创建一个新列。
下面是一些相关信息,如果您需要更多信息,请告诉我。
提前致谢!
堆栈跟踪
...
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.4.1.v20121003 ad44345): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 't0.TESTFIELD' in 'field list'
Error Code: 1054
at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:333)
...
持久性.xml:
<persistence-unit name="myApp" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/mysql</jta-data-source>
<mapping-file>META-INF/orm.xml</mapping-file>
<properties>
<property name="eclipselink.ddl-generation.output-mode" value="database"/>
<property name="eclipselink.jdbc.batch-writing" value="Buffered"/>
<property name="eclipselink.logging.level" value="INFO"/>
<property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
</properties>
额外信息
drop-and-create-tables 确实有效。
我正在使用 merge(entity) 来持久化新实体(因为它们有很多多对一的字段,否则会导致重复的主 ID 问题) - 我觉得这可能是问题所在。
查看 MySQL 日志以及来自 EclipseLink 的最佳日志级别,EclipseLink 首先尝试从数据库中选择实体,如下所示:
mysql_log:
121115 10:49:03 9 Query SELECT t0.LISTINGID, t0.DTYPE, ... , t0.TESTFIELD FROM the_entity...
这是最后一个 mysql 日志条目,这意味着它在这里崩溃,它从不尝试删除表等。这是否意味着您不能将合并与 drop-and-create 或 create-or-extend 一起使用?我只是做了一个谷歌并没有找到任何关于此的信息。
EclipseLink 日志记录:
FINER: client acquired: 64279491
FINER: TX binding to tx mgr, status=STATUS_ACTIVE
FINER: acquire unit of work: 161130796
FINEST: Merge clone with references nz.co.site.api.v1.ListedItemDetail@8d88ca1
FINEST: Execute query ReadObjectQuery(referenceClass=ListedItemDetail )
FINEST: Connection acquired from connection pool [read].
FINEST: reconnecting to external connection pool
FINE: SELECT t0.LISTINGID, t0.DTYPE, ... , t0.TESTFIELD, ... , FROM ITEM t0, LISTEDITEMDETAIL t1 WHERE ((t0.LISTINGID = ?) AND ((t1.LISTINGID = t0.LISTINGID) AND (t0.DTYPE = ?)))
bind => [2 parameters bound]
FINE: SELECT 1
FINEST: Connection released to connection pool [read].
WARNING: Local Exception Stack:
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.DatabaseException
我使用 bean 事务管理来合并新实体:
userTransaction.begin();
entityManager.merge(entity);
entityManager.flush();
userTransaction.commit();