將EJB實體bean用作Map鍵是否可行?事情是這樣的:使用EJB實體bean作爲Map鍵
Map <EntityBean,String> map = new HashMap<>();
我假設,因爲在表的每一行都會被映射到一個單一的實體bean對象不應該有任何問題,但有什麼影響?我不打算堅持地圖。
將EJB實體bean用作Map鍵是否可行?事情是這樣的:使用EJB實體bean作爲Map鍵
Map <EntityBean,String> map = new HashMap<>();
我假設,因爲在表的每一行都會被映射到一個單一的實體bean對象不應該有任何問題,但有什麼影響?我不打算堅持地圖。
首先,EntityBean是一個EJB實現接口,而不是客戶端編程接口。您不應該引用EntityBean,只有EJBObject或EJBLocalObject。
無論如何,沒有,HashMap<EJB(Local)Object, ...>
是無效的,因爲的hashCode和equals是不確定的EJB(本地)對象按照EJB 3.2可選規格,3.9節(或類似語言的早期版本):
注意Enterprise JavaBeans體系結構沒有爲實體對象 引用指定 「對象相等」(即使用==運算符)。使用 Java編程語言Object.equals(Object obj)方法比較兩個對象引用的結果是未指定的 。對兩個對象執行Object.hashCode()方法 代表實體對象的引用不保證 會產生相同的結果。因此,客戶端應始終使用isIdentical方法來確定兩個實體對象引用 是否引用同一個實體對象。
通常沒有辦法散列實體bean引用,因爲沒有辦法確定其基礎標識。根據您在應用程序中的限制,您可以使用EJBObject.getPrimaryKey()
或{entityInterface,primaryKey}元組作爲您的映射鍵(對於某些元編程,您可以使用EJBObject.getEJBMetaData().getRemoteInterfaceClass()
)。 (您可能想知道爲什麼EJB規範限制了這一點,實體Bean只作爲本地啓動,至少對於遠程RMI-IIOP存根,equals和hashCode會比較存根標識而不是底層對象。在通過不同的服務器獲得邏輯上相同的實體引用時出現問題,或者對於邏輯上相同的實體引用而言序列化形式不同的複雜主鍵,可能理論上EJB規範可能提供了某種類型的EJB(本地)Object.getIdentity()會實現hashCode和equals,但即使如此,在確定兩個實體bean是否具有相同的底層「類型」(實現應用程序/ bean?支持表?或什麼?)時也很複雜,但從實體bean編程模型已經死了;使用JPA。如果你堅持使用實體bean並且可以做出假設你的應用程序,那麼你可以避免這些複雜性/問題,併成功地哈希實體Bean引用,如上所述)。
如何使用EJB來表示數據庫行?正如我所知,爲此目的有JPA實體(類別註解@Entity)。 EJB bean通常爲這些實體提供一些服務(如CRUD操作或更復雜的東西,您可以閱讀有關服務門面模式的信息)。