2014-11-17 3 views
2

Кто-нибудь пытался интегрировать spring-data-jpa с приложением java-ee? Я использую glassfish3 в качестве контейнера для приложений.Spring-Data-JPA в среде CDI?

Я последовал официальный учебник весна-данные JPA и создал класс:

public class EntityManagerFactoryProducer { 

    @Produces 
    @ApplicationScoped 
    public EntityManagerFactory createEntityManagerFactory() { 
     return Persistence.createEntityManagerFactory("myPU"); 
    } 

    public void close(@Disposes EntityManagerFactory entityManagerFactory) { 
     entityManagerFactory.close(); 
    } 

    @Produces 
    @RequestScoped 
    public EntityManager createEntityManager(EntityManagerFactory entityManagerFactory) { 
     return entityManagerFactory.createEntityManager(); 
    } 

    public void close(@Disposes EntityManager entityManager) { 
     entityManager.close(); 
    } 
} 

Но когда я пытаюсь развернуть мое приложение, я получаю исключение:

Error occurred during deployment: Exception while preparing the app : Could not resolve a persistence unit corresponding to the persistence-context-ref-name [org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean/entityManager] in the scope of the module called [App]. Please verify your application.. Please see server.log for more details. 
Command deploy failed. 

Что я пропал без вести? Должен ли я иметь еще один файл конфигурации или, возможно, некоторый файл xml?

+0

Я думаю, что проблема может быть, что вы не имеете блок сохранения с именем "myPU", объявленной в вашем persistence.xml. Но я также не думаю, что это правильный подход. См. Мой ответ для деталей. – Gandalf

+0

PU объявляется правильно. – slnowak

ответ

2

Поскольку вы находитесь в контейнере приложений Java EE, вы не хотите создавать свой собственный экземпляр Persistence. Пример из документации Spring Data, которую вы использовали, относится к средам CDI, которые не имеют встроенной поддержки JPA. Glasfish создает EntityManagerFactory и EntityManager для вас. Вам нужно только переиздать его как CDI bean. Так что в вашем случае важно использовать второй пример, показанный в документации:

public class EntityManagerProducer { 

    @Produces 
    @RequestScoped 
    @PersistenceContext 
    private EntityManager entityManager; 
} 
+0

Насколько я помню, я попробовал, и это не сработало. Но я попробую еще раз, спасибо. – slnowak

0

Это немного сложнее, что сказано в официальной документации. Чтобы справиться с правильно Весенней Repository в окр CDI, вы должны объявить:

  • зависимая сущность производитель менеджера

    @Produces @Dependent @PersistenceContext 
    EntityManager entityManager; 
    
  • нетерпеливого хранилище

    @Eager public interface TestRepository extends CrudRepository<TestEntity, Long> 
    

Тогда вы сможете получить @Inject репозиторий в управляемом CDI бине. Если вы не используете аннотацию и @Eager, весна приведет к исключениям при инициализации репозиториев, что приведет к нечетным расчетам по первому запросу, сделанному против него.

Ссылки:

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

  • Нет связанных вопросов^_^