Sun Java System Application Server Platform Edition 9 发行说明

Java Persistence API

本节列出了与 Java Persistence API 相关的已知问题和相应的解决方案。

如果 UPDATEDELETE 查询在 WHERE 子句中使用子查询,会导致查询编译过程中出现 NullPointerException

有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=572

解决方法

请勿使用此类型的查询。

查询编译器不会检查 Java Persistence 语言规范中定义的所有规则。

查询编译器不会检查 Java Persistence 语言的规范一章中定义的所有规则。特别是,它不检查以下各项:

无效的查询可能会进行编译,但可能会导致在运行时出现 SQLException。或者也可能出现以下情况:基础数据库比较宽松且支持 SQL,但在其他数据库上执行相同查询时会失败,并出现 SQLException

解决方法

手动验证上述条件。

如果查询按 JOIN 变量分组且直接选择 JOIN 变量,则可能会导致 SQLException

如果查询按 JOIN 变量分组且直接选择 JOIN 变量,则可能会导致 SQLException 报告选定的表达式未分组。有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=197。例如:


SELECT AVG(o.totalPrice), c FROM Order o JOIN o.customer c GROUP BY c

解决方法

可能的解决方法是直接浏览此关系,而不是定义 JOIN 变量,例如:


SELECT AVG(o.totalPrice), o.customer FROM Order GROUP BY o.customer

在某些情况下,查询编译器会抛出误导性的错误消息,这是因为它在错误消息中提到了错误的令牌。

有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=550

解决方法

手动验证查询中的哪些内容是错误的。

当前,无法在同一 EAR 文件中部署包含相同类的两个持久性单元。

解决方法

使用不同的类名称。

无法使用 persistence.xml 中的类元素明确地列出 MappedSuperclass

有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=558

解决方法

请勿明确地列出 MappedSuperclass

在继承的类上实体映射 @ManyToMany 失败。

有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=578

解决方法

请勿在子类中使用 ManyToMany 关系。

如果对某个关系使用 List<>,会导致 MetadataHelper.getAttributeNameFromMethodName 中出现 StringIndexOutOfBoundException

有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=557

解决方法

使用 java.util.Collection 代替。

无法将空数据库值映射到图元。

解决方法

通过使用 Java 包装对象类型,映射到可为 null 的数据库列。

从客户端访问 LAZY 初始化关系有时会导致 NullPointerException

有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=404

解决方法

在将实例返回到客户机之前,以服务器端代码访问 LAZY 初始化关系。

如果查询选择关系字段,则在查询结果中不包括 null 值。

如果查询选择关系字段,则在关系字段值为 null 时查询结果中不包括 null 值。而会在查询结果中遗漏此条目,例如:


SELECT o.customer FROM Order o WHERE ...

有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=637

解决方法

从相关实例中选择状态字段。


SELECT o.customer.customerId FROM Order o WHERE ...

如果查询选择为单值关系字段定义的 JOIN 标识变量,则可能会产生无效的 SQL。

例如:


SELECT c FROM Order o LEFT OUTER JOIN o.customer c

有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=638

解决方法

从相关实例中选择状态字段。


SELECT c.customerId FROM Order o LEFT OUTER JOIN o.customer c

EntityManager.find() 错误地抛出 IllegalArgumentException

如果主键类由 @IdClass 注释定义,EntityManager.find() 会对作为其他实体子类的实体错误地抛出 IllegalArgumentException。有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=595

解决方法

将最顶层超类的类用作 find() 方法的参数,并将结果强制转换为子类。

无法保持关系字段设置为 java.util.HashSet 的实体。

有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=643

解决方法

java.util.ArrayList 用作初始值。