3

我第一次尝试 OpenJPA 2.0.1,并且得到:

79  WARN   [main] openjpa.Runtime - The configuration property named "openjpa.Id" was not recognized and will be ignored, although the name closely matches a valid property called "openjpa.Id".
179  INFO   [main] openjpa.Runtime - Starting OpenJPA 2.0.1
371  INFO   [main] openjpa.jdbc.JDBC - Using dictionary class "org.apache.openjpa.jdbc.sql.PostgresDictionary" (PostgreSQL 8.4.4 ,PostgreSQL Native Driver PostgreSQL 9.0 JDBC4 (build 801)).
<openjpa-2.0.1-r422266:989424 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: Attempt to cast instance "x.quality.QualityQuery@4c4b11e9" to PersistenceCapable failed.  Ensure that it has been enhanced.
FailedObject: x.quality.QualityQuery@4c4b11e9
    at org.apache.openjpa.kernel.BrokerImpl.assertPersistenceCapable(BrokerImpl.java:4559)
    at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2561)
    at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2423)
    at org.apache.openjpa.kernel.DelegatingBroker.persist(DelegatingBroker.java:1069)
    at org.apache.openjpa.persistence.EntityManagerImpl.persist(EntityManagerImpl.java:706)
    at ...

根据OpenJPA docs,我不应该做任何事情来在运行时获得基本的增强:

2.5. 省略 OpenJPA 增强器

OpenJPA 不需要运行增强器。如果您不运行增强器,OpenJPA 将退回到状态跟踪的几种可能替代方案之一,具体取决于执行环境。

Java 6 类重新转换:

如果您在 Java 6 环境中运行您的应用程序,OpenJPA 将尝试动态注册一个 ClassTransformer,它将动态重新定义您的持久类以跟踪对持久数据的访问。此外,OpenJPA 将为您的每个持久类创建一个子类。当您执行查询或遍历关系时,OpenJPA 将返回子类的实例。这意味着 instanceof 运算符将按预期工作,但 o.getClass() 将返回子类而不是您编写的类。您根本不需要做任何事情来获得这种行为。OpenJPA 将自动检测执行环境是否能够进行 Java 6 类重新转换。

任何线索为什么这不起作用?非常感谢...

(为什么会发生 openjpa.Id 警告的加分点 - 我没有设置任何此类属性......)

4

1 回答 1

2

啊哈,原来答案是通过:

"openjpa.RuntimeUnenhancedClasses" => RuntimeUnenhancedClassesModes.SUPPORTED

到配置图。为什么没有更清楚地记录这一点,我不确定......

于 2010-11-05T02:47:08.223 回答