使用EJB实体bean作为映射键



使用EJB实体bean作为Map键可以吗?类似这样的东西:

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

我认为,由于表中的每一行都将映射到一个实体bean对象,所以应该不会有任何问题,但这是否有任何含义?我不打算坚持这张地图。

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

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

请注意,Enterprise JavaBeans体系结构没有指定实体对象的"对象相等"(即使用==运算符)参考文献。使用Java编程语言Object.equals(Object-obj)方法是未指明。对两个对象执行Object.hashCode()方法表示实体对象的引用不能保证产生相同的结果。因此,客户端应始终使用isIdential方法来确定两个实体对象是否引用引用同一实体对象。

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

(您可能想知道为什么EJB规范限制了这一点。实体bean仅作为本地启动,至少对于远程RMI-IIOP存根,equals和hashCode会比较存根标识,而不是底层对象。这会给通过不同服务器获得的逻辑上相同的实体引用或逻辑上序列化形式不同的复杂主键带来问题。)完全相同的实体引用。也许在理论上,EJB规范可以提供某种EJB(Local)Object.getIdentity(),它将实现hashCode和equals,但即使这样,在确定两个实体bean是否具有相同的底层"类型"(实现app/bean?backing table?还是什么?)方面也很复杂,但这主要是一个没有意义的问题,因为实体bean编程模型已经死了;使用JPA。如果您一直使用实体bean,并且可以在应用程序中进行假设,那么您就可以避免这些复杂性/问题,并成功地对实体bean引用进行散列,正如我上面所描述的那样。)

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

最新更新