使用 EJB 实体 bean 作为映射键

Use of EJB entity bean as Map key

可以使用EJB 实体bean 作为映射键吗?像这样:

Map <EntityBean,String> map = new HashMap<>();

我假设因为 table 中的每一行都将映射到单个实体 bean 对象,所以应该没有任何问题,但是有什么影响吗?我不打算保留地图。

您想如何使用EJB 来表示数据库行?据我所知,为此目的有 JPA 实体(类 用 @Entity 注释)。 EJB bean 通常为这些实体提供一些服务(比如 CRUD 操作或更复杂的东西,您可以阅读服务门面模式)。

首先,EntityBean是EJB实现接口,不是客户端编程接口。您永远不应该引用 EntityBean,只能引用 EJBObject 或 EJBLocalObject。

无论如何,不​​,HashMap<EJB(Local)Object, ...> 无效,因为根据 EJB 3.2 可选规范第 3.9 节(或早期版本中的类似语言),没有为 EJB(Local)Object 定义 hashCode 和 equals:

Note that the Enterprise JavaBeans architecture does not specify “object equality” (i.e. use of the == operator) for entity object references. The result of comparing two object references using the Java programming language Object.equals(Object obj) method is unspecified. Performing the Object.hashCode() method on two object references that represent the entity object is not guaranteed to yield the same result. Therefore, a client should always use the isIdentical method to determine if two entity object references refer to the same entity object.

通常无法散列实体 bean 引用,因为无法确定其底层身份。根据您在应用程序中所做的限制,您可以使用 EJBObject.getPrimaryKey() 或 {entityInterface,primaryKey} 元组作为映射键(对于某些元编程,您可以使用 EJBObject.getEJBMetaData().getRemoteInterfaceClass()).

(您可能想知道为什么 EJB 规范对此进行限制。实体 bean 仅作为本地启动,并且至少对于远程 RMI-IIOP 存根,equals 和 hashCode 将比较存根身份而不是底层对象。那对于通过不同服务器获得的逻辑上相同的实体引用或对于逻辑上相同的实体引用的序列化形式不同的复杂主键,可能会导致问题。也许在理论上 EJB 规范可以提供某种 EJB(Local)Object.getIdentity () 本来可以实现 hashCode 和 equals,但即便如此,确定两个实体 bean 是否具有相同的底层 "type"(实现 app/bean?支持 table?还是什么?)仍然很复杂。 ,但这主要是一个有争议的问题,因为实体 bean 编程模型已经死了;使用 JPA。如果你坚持使用实体 bean 并且可以在你的应用程序中做出假设,那么你可以避免这些 complexities/problems 并成功散列实体 bean参考我上面描述的。)