2010-09-21 38 views
1

奇怪的东西......我很高兴地使用EclipseLink/JPA 2作为持久性单元的提供者(在后面有一个MySQL RDBMS)。我关闭了DDL-drop/create,因为我想将记录保存在数据库中,并且无论如何都没有对实体进行任何更改。Eclipselink生活在过去,DDL没有反映实体

现在我对一个实体做了一些更大的改变(添加了一些属性,重命名/重新输入其他属性,将以前嵌入的对象导入到此实体中,等等)。我打开DDL-drop/create,重新部署几次,...没有任何变化!

EclipseLink实际上基于信息创建(并重新创建)SQL表!这就像它有一个Java类的副本,并忽略了我刚刚更新的那个...

更疯狂,先前嵌入的对象已经消失。我删除了类文件。 Eclipselink 仍然在先前嵌入类的表中创建属性。

我在GlassFish server.log中看不到例外情况。我放弃并重新创建了持久性单元,没有改变。有任何想法吗? (让我知道如果我应该张贴任何代码/日志条目,我会更新这个帖子。)

更新:设置eclipselink.logging.levelFINEST后,我仍然看到没有例外。创建DDL脚本(在其中有错误的列)并愉快地在DB上执行(当然创建了错误的列)。在日志中我看到的EclipseLink谈论是不存在了的字段:

[#|2010-09-22T17:04:11.392+0200|CONFIG|glassfish3.0.1|org.eclipse.persistence.session.file:/Users/hank/NetBeansProjects/CoreServer/build/classes/_coreServerPersistenceUnit.ejb_or_metadata|_ThreadID=20;_ThreadName=Thread-1;| 
The alias name for the entity class [class mvs.entity.Shopper] is being defaulted to: Shopper.|#] 

[#|2010-09-22T17:04:11.392+0200|CONFIG|glassfish3.0.1|org.eclipse.persistence.session.file:/Users/hank/NetBeansProjects/CoreServer/build/classes/_coreServerPersistenceUnit.ejb_or_metadata|_ThreadID=20;_ThreadName=Thread-1;| 
The column name for element [field msisdn] is being defaulted to: MSISDN.|#] 

[#|2010-09-22T17:04:11.392+0200|CONFIG|glassfish3.0.1|org.eclipse.persistence.session.file:/Users/hank/NetBeansProjects/CoreServer/build/classes/_coreServerPersistenceUnit.ejb_or_metadata|_ThreadID=20;_ThreadName=Thread-1;| 
The column name for element [field imei] is being defaulted to: IMEI.|#] 

在这种情况下mvs.entity.Shopper是类。 msisdn是一个现有的字段,但imei不再存在。不知道EclipseLink从哪里获取信息...

顺便说一句,我有eclipselink.weaving设置为false,因为它导致延迟加载的问题。这可能是相关的吗?

更新2:按照戈登的建议,我查找了实体的旧副本,但找不到任何。在新鲜的GlassFish上部署应用程序而不是显示上面的行为;而是正确地完成了的映射和DDL创建一样! Yippie :)

我唯一的结论是,旧的副本必须保留在GlassFish的某个地方,即使在取消部署之后......这有道理吗?

+0

您可以启用Eclipselink日志记录到文件并将日志记录级别设置为调试。然后启动你的应用程序,看看你得到关于DDL的消息。 – Pace 2010-09-22 14:39:52

+0

@Pace:thx您的回应。我已更新该帖子。任何其他想法? – Hank 2010-09-22 15:26:28

+0

您应该发布最新的更新作为答案并接受它。 – 2010-09-23 00:37:16

回答

0

安装GlassFish的全新副本并将应用程序部署到其中,解决了问题。比较GF的两个副本后,我在glassfish/domains/domain1/lib中发现了一个旧的构建工件,其中包含旧的实体定义。消除后,一切都如预期。

所以在一天结束时,我自己的愚蠢的错误。

1

要么在类路径中有旧映射或正在部署旧版本类的orm.xml文件。 EclipseLink无法在部署之间“存储”类。尝试反编译部署中的类文件以查看它是否有更改。

+0

谢谢。我反编译NetBeans构建的工件,这很好。在任何地方都找不到orm.xml文件。但我设法通过安装glassfish 3.0.1的新副本来解决它,请参阅更新。 – Hank 2010-09-22 21:01:53