About

12 сент. 2013 г.

Использование нескольких persistence unit в одном проекте.


Когда  в проекте несколько персистенс юнитов, возникает такой эксепшн :

SEVERE:   Exception while invoking class org.glassfish.persistence.jpa.JPADeployer prepare method
SEVERE:   java.lang.RuntimeException: Could not resolve a persistence unit corresponding to the persistence-context-ref-name [com.str.testpu.facade.UserFacade/em] in the scope of the module called [StrTestPU]. Please verify your application.


Например в проекте два персистент юнита. Контейнер не может определить какой из них грузить. Это решается заданием имен персистент контекстам с разными юнитами, таким образом в web.xml достаточно добавить :
 <persistence-context-ref>
      <persistence-context-ref-name>persistence/userPC</persistence-context-ref-name>
      <persistence-unit-name>userPU</persistence-unit-name>
</persistence-context-ref>
 <persistence-context-ref>
      <persistence-context-ref-name>persistence/homePC</persistence-context-ref-name>
      <persistence-unit-name>homePU</persistence-unit-name>
 </persistence-context-ref>
<persistence-context-ref-name>  - тут обозначается некое имя задаваемое произвольно. Как советует документация лучше начинать с persistence.
 <persistence-unit-name> - тут пишем имя юнита которое указано в persistence.xml.

Инъекции выглядят так:
@PersistenceContext( name="persistence/homePC" unitName = "homePU")
private EntityManager em;

@PersistenceContext( name = "persistence/userPC", unitName = "userPU")
private EntityManager em;
Атрибут name в @PersistenceContext должен совпадать с значением <persistence-context-ref-name> в web.xml, и unitName соответственно с <persistence-unit-name>.

В эксперименте принимали участие: Glassfish 4, Netbeans 7.4, EJB, JPA, EclipseLink, MySql, Maven.

Вот интересная статья по этому поводу, а также пример.
А документация наше всё.

0 comments:

Отправить комментарий