2015-04-17 4 views
0

Можно ли использовать компонент EJB-компонента в качестве ключа карты? Что-то вроде этого:Использование компонента EJB entity в качестве ключа карты

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

Я предполагаю, что, поскольку каждая строка таблицы будет отображаться в одной сущности объекта боб не должно быть никаких проблем, но есть какие-либо последствия? Я не планирую сохранять карту.

ответ

0

Во-первых, EntityBean является интерфейсом реализации EJB, а не интерфейсом клиентского программирования. У вас никогда не должно быть ссылок на EntityBean, только EJBObject или EJBLocalObject.

Несмотря на это, нет, HashMap<EJB(Local)Object, ...> не действует, так как хэш-код и равно не определены для EJB (Local) объекта в соответствии с EJB 3.2 необязательной спецификации, раздел 3.9 (или аналогичный язык в более ранних версиях):

Обратите внимание, что Архитектура Enterprise JavaBeans не указывает «равенство объекта» (то есть использование оператора ==) для объекта объекта ссылок. Результат сравнения двух ссылок на объекты с использованием метода Java Object Language (Object obj) Java является неуказанным. Выполнение метода Object.hashCode() для двух объектов ссылки, которые представляют объект объекта, не гарантируются , дают тот же результат. Таким образом, клиент должен всегда использовать метод isIdentical, чтобы определить, ссылаются ли на два объекта объекта объекта на один и тот же объект сущности.

В общем случае вообще нет хеша ссылки на объект bean, потому что нет способа определить его базовую идентичность. В зависимости от того, что вы делаете в своем приложении, вы можете использовать либо EJBObject.getPrimaryKey(), либо {entityInterface, primaryKey} кортеж в качестве ключа карты (для некоторого метапрограммирования вы можете использовать EJBObject.getEJBMetaData().getRemoteInterfaceClass()).

(Возможно, вам интересно, почему спецификация EJB ограничивает это. Сущности-объекты начинаются как локальные, а для удаленного RMI-IIOP-заглушки, по крайней мере, equals и hashCode будут сравнивать идентификатор-заглушку, а не базовый объект. вызывают проблемы для логически идентичных ссылок на объекты, полученные с помощью разных серверов или для сложных первичных ключей, где сериализованная форма отличается для логически идентичных ссылок на объекты. Возможно, теоретически спецификация EJB могла бы предоставить какой-то EJB (локальный) Object.getIdentity(), который был бы реализован hashCode и равен, но даже тогда есть сложности в определении того, имеет ли один объект beans один и тот же базовый «тип» (таблица поддержки приложения/компонента bean? или что?), но в основном это спорный момент, поскольку entity bean модель программирования мертва, используйте JPA. Если вы застряли с объектными компонентами и можете делать предположения в ваше приложение, то вы можете избежать этих сложностей/проблем и успешно использовать хеш-объекты bean-ссылок, как я описал выше.)

0

Как вы хотите использовать EJB для представления строки базы данных? Как известно, для этой цели существуют объекты JPA (классы, аннотированные с помощью @Entity). Бобы EJB обычно предоставляют некоторые услуги для этих объектов (например, операции CRUD или что-то более сложное, вы можете прочитать о шаблоне фасада службы).

Смежные вопросы