Jakarta ee 日食“;“创建或扩展表”;不工作:“…”;。。。未知列…“;

Jakarta ee 日食“;“创建或扩展表”;不工作:“…”;。。。未知列…“;,jakarta-ee,jpa,glassfish,eclipselink,Jakarta Ee,Jpa,Glassfish,Eclipselink,我将EclipseLink 2.4.1与Glassfish一起使用,并使用MySQL数据库来持久化实体 我向一个实体添加了一个字段,当我试图持久化这个实体时,它会说新字段“未知”。 我们应该如何使用新的“创建或扩展表”功能?我原以为它会为这个领域创建一个新的专栏 下面是一些相关信息,如果您需要更多,请告诉我 提前谢谢 堆栈跟踪 ... Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.4.1.v20

我将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)
...
persistence.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>
这是最后一个mysql日志条目,意味着它在这里崩溃,它从不尝试删除表等。这是否意味着您不能使用merge with drop and create或create或extend?我只是在谷歌上搜索了一下,没有找到任何相关信息

日食记录:

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();

Glassfish截取eclipselink.ddl-generation.output-mode属性并强制将其写入文件,如下面的回答所述: 因此,您需要检查是否已在Glassfish中启用java2db,以便“拖放并创建表”工作

但“创建或扩展表”需要数据库连接才能查看数据库中的内容,因此目前无法使用sql脚本输出模式。我不知道如何强制Glassfish不覆盖output mode属性,但如果无法做到,则需要运行持久化单元端Glassfish来使用此功能

glassfish的一个解决方法是尝试以下内容:

Map properties = new HashMap();
properties.put(PersistenceUnitProperties.DDL_GENERATION, PersistenceUnitProperties.CREATE_OR_EXTEND);
//create-or-extend only works on the database
properties.put(PersistenceUnitProperties.DDL_GENERATION_MODE, PersistenceUnitProperties.DDL_DATABASE_GENERATION);
//this causes DDL generation to occur on refreshMetadata rather than wait until an em is obtained
properties.put(PersistenceUnitProperties.DEPLOY_ON_STARTUP, "true");
JpaHelper.getEntityManagerFactory(em).refreshMetadata(properties);

Glassfish截取eclipselink.ddl-generation.output-mode属性并强制将其写入文件,如下面的回答所述: 因此,您需要检查是否已在Glassfish中启用java2db,以便“拖放并创建表”工作

但“创建或扩展表”需要数据库连接才能查看数据库中的内容,因此目前无法使用sql脚本输出模式。我不知道如何强制Glassfish不覆盖output mode属性,但如果无法做到,则需要运行持久化单元端Glassfish来使用此功能

glassfish的一个解决方法是尝试以下内容:

Map properties = new HashMap();
properties.put(PersistenceUnitProperties.DDL_GENERATION, PersistenceUnitProperties.CREATE_OR_EXTEND);
//create-or-extend only works on the database
properties.put(PersistenceUnitProperties.DDL_GENERATION_MODE, PersistenceUnitProperties.DDL_DATABASE_GENERATION);
//this causes DDL generation to occur on refreshMetadata rather than wait until an em is obtained
properties.put(PersistenceUnitProperties.DEPLOY_ON_STARTUP, "true");
JpaHelper.getEntityManagerFactory(em).refreshMetadata(properties);

您可以发布新映射并将日志记录设置为finest并显示生成的DDL吗?drop和create tables是否起作用?不,drop和create tables也不起作用!对不起,我不知道你说的新映射是什么意思?你是说新的实体类吗?我在问题的底部添加了一些额外的信息。您需要将日志记录转到更高的级别,以查看在数据库中执行的DDL,以确定出了什么问题,因为DDL异常不是致命的,也不是在信息级别写入的。尝试将其设置为FINE或FINEST:您可以发布新映射并将日志记录设置为FINEST并显示生成的DDL吗?drop和create tables是否起作用?不,drop和create tables也不起作用!对不起,我不知道你说的新映射是什么意思?你是说新的实体类吗?我在问题的底部添加了一些额外的信息。您需要将日志记录转到更高的级别,以查看在数据库中执行的DDL,以确定出了什么问题,因为DDL异常不是致命的,也不是在信息级别写入的。尝试将其设置为“精细”或“最佳”:谢谢您的快速回答!有点太快了,我添加额外信息的时间比你回复的时间要长,所以你可能想看看我问题的底部。我认为问题可能与我正在合并这一事实有关,因此它首先执行select语句,该语句失败,因为该字段不在数据库中。你会得出同样的结论吗?如果是的话,你知道解决这个问题的方法吗?只是为了澄清一下,如果我不添加一个新字段,删除并创建表是有效的。在部署时,它会删除所有表并重新创建它们。错误表明该字段不存在,因此这不是合并问题。如果不添加新字段,我不确定你所说的drop+create work是什么意思。它在部署时工作,那么如何向实体添加一个它无法工作的字段呢?不是被重新部署了吗?很抱歉回复的时间太长了,我有点放弃了,因为它占用了我的时间。我刚刚回顾了它,至少在目前,“创建或扩展表”似乎没有任何作用,就像它不受支持一样。它不会在部署时删除、创建或扩展任何表。更改为创建表或拖放并创建表可以正常工作。根据日志,EclipseLink版本为2.4.1。这将解释我所遇到的所有问题(尽管我本以为我会注意到),因为它会在合并过程中尝试选择一个不存在的字段。正如答案中提到的,Glassfish基于其java2db特性注入eclipselink属性。如果启用,则将ddl生成模式设置为drop和create tables,如果禁用,则将其设置为none。它完全覆盖用户指定的属性值。我认为让“创建或扩展表”起作用的唯一方法是在glassfish外部运行持久化单元。请提交一个glassfish bug/增强,因为应该有办法让EclipseLink处理DDL。感谢您的快速回答!有点太快了,我添加额外信息的时间比你回复的时间要长,所以你可能想看看我问题的底部。我认为问题可能与我正在合并这一事实有关,因此它首先执行select语句,该语句失败,因为该字段不在数据库中。你会得出同样的结论吗?如果是的话,你知道解决这个问题的方法吗?只是为了澄清一下,如果我不添加一个新字段,删除并创建表是有效的。在部署时,它会删除所有表并重新创建它们。错误表明该字段不存在,因此这不是合并问题。如果不添加新字段,我不确定你所说的drop+create work是什么意思。它在部署上起作用,