奇怪的东西......我很高兴地使用EclipseLink / JPA 2作为我的持久性单元的提供者一段时间(后面有一个MySQL RDBMS)。我关闭了DDL-drop / create,因为我想在数据库中保留记录,而且实体上没有任何变化。
现在我刚刚对一个实体做了一些更大的更改(添加了一些属性,重命名/重新键入其他属性,将以前嵌入的对象平面导入到此实体中等)。我打开DDL-drop / create,重新部署了几次,然后......没有任何变化!
EclipseLink实际上是根据旧信息创建(并重新创建)SQL表!就好像它有一个Java类的副本而忽略了我刚更新的那个......
更加疯狂,之前嵌入的对象已经消失。我删除了类文件。 Eclipselink 仍然在先前嵌入的类的表中创建属性。
我在GlassFish server.log中看不到任何异常。我放弃并重新创建了持久性单元,没有任何变化。有任何想法吗? (如果我发布任何代码/日志条目,请告诉我,我将更新此帖子。)
更新:将eclipselink.logging.level
设置为FINEST
后,我仍然看到没有例外。创建了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 :(得分:1)
您的类路径上有一个带有旧映射的orm.xml文件,或者正在部署该类的旧版本。 EclipseLink无法在部署之间“存储”类。尝试反编译部署中的类文件,看看它是否有更改。
答案 1 :(得分:0)
安装GlassFish的新副本并将应用程序部署到它可以解决问题。在比较GF的两个副本之后,我在glassfish/domains/domain1/lib
中找到了一个旧的构建工件,其中包含旧的实体定义。删除后,一切都按预期进行。
所以在一天结束时,我自己的愚蠢错误。