Как получить доступ к EntityManager внутри класса Entity в EJB3 - PullRequest
2 голосов
/ 14 марта 2012

Мне нужно выполнить порядок запросов к базе данных, чтобы установить дополнительный столбец «Порядок по столбцу» в таблице сопоставления «многие ко многим». поэтому мне нужно получить доступ к последовательности db изнутри класса Entity, и выбрать следующее значение последовательности и присвоить его столбцу order_by в методе обратного вызова жизненного цикла @prepersist.
</p> <pre><code>@Entity public class ProductWishlist implements Serializable { .... @Column(name="ORDER_BIT") private long orderBit; // getter setter // ....... @Prepersist public void setOrderBit(EntityManager entityManager) { Query q=entityManager.createNativeQuery("select nextval('SHP_PRODUCTS_PICS_ORDER_SEQ')"); Long order=(Long)q.getResultList().get(0); this.setOrderBit(order); } }

Как я могу получить доступ к entitymanger из setOrderBit ()? как я могу передать Entitymanager в него? Или Как я могу выполнить собственный запрос внутри класса Entity?

Ответы [ 2 ]

2 голосов
/ 15 марта 2012

Внедрение EntityManager в объектный компонент не рекомендуется. На мой взгляд, объектный компонент, действующий как POJO, предназначен для передачи данных между уровнями или сетью.

Лучше предварительно заполнить сущность, манипулировать данными до сохранения. Но некоторая проверка атрибутов или форматирования данных может быть выполнена в методах обратного вызова объекта.

Здесь вы можете попробовать использовать прослушиватель объектов, применив аннотацию @EntityListeners к объекту, которая получает уведомление о методе обратного вызова жизненного цикла объекта.

1 голос
/ 14 марта 2012

Вы не должны использовать EntityManager в pre-persist (или в методах жизненного цикла в целом), потому что это не вслух согласно спецификации:

Как правило, метод жизненного цикла переносимого приложения не должен вызвать операции EntityManager или Query, получить доступ к другому объекту экземпляры, или изменить отношения в пределах той же персистентности контекст. [43] Метод обратного вызова жизненного цикла может изменить сообщение несвязанное состояние объекта, для которого он вызывается.

[43] Семантика таких операций может быть стандартизирована в будущем. выпуск этой спецификации.

Просто получите нормальное соединение JDBC и используйте его для выполнения запроса.

...