2016-11-23 7 views
1

Я работаю с Spring + JPA (с гибернацией в качестве провайдера JPA), используя сервисы и dao.Spring + JPA EntityManager введен в эксплуатацию и dao

Я хотел бы ввести JPA EntityManager как в сервисе, так и в dao, с сервисом, управляющим транзакциями, и дао, управляющим сохранением объекта.

Дао является @Autowired на службе, а EntityManager вводится как в Сервис, так и в Дао, с @Autowired.

Таким образом, я гарантированно вводю то же самое EntityManager как в Сервис, так и в дао?

+0

@shazin: как вы можете настроить компонент JPA EntityManager как одиночный или прототип? – grsdev7

ответ

2

Вы можете ввести EntityManager, используя @PersistenceContext, который будет вводить совместно используемый EntityManager, управляемый Spring. Но я думаю, вы должны пересмотреть свой подход к EM в классе обслуживания.

Также смотрите здесь: Doc

В комментариях обновления параметров порядка: вы можете иметь EntityManager только в классах DAO, но делают те, чтобы быть atominc дао заезжает же метод обслуживания и сделать его transactional.Check из Two Dao atomic calls

+0

Дело в том, что я скажу одно дао или более, которые отвечают за сохранение моих сущностей. Мне нужна служба, которая обрабатывает транзакцию. Если я сделаю это на daos, у меня могут быть грязные транзакции в случае ошибок. Как я могу управлять им иначе? – Massimo

+0

@Massimo вы можете иметь EntityManager только в классах DAO, но заставляйте эти вызовы daam атома в одном и том же методе обслуживания и делать его транзакционным. Проверьте http://stackoverflow.com/questions/3886909/where-should-transactional-be -place-service-layer-or-dao – grsdev7

+0

Спасибо, что мне нужно, пожалуйста, обновите свой ответ, поэтому я буду отмечать как решение – Massimo

0

Вы пробовали @PersistenceContext аннотацию

@PersistenceContext 
private EntityManager entityManager; 

Взгляните на эту link для получения дополнительной информации. Также посмотрите here на все возможные варианты, которые у вас есть с этой аннотацией.

1

EntityManager инициализируется как компонент Singleton, поэтому вам не нужно беспокоиться, пока вы убедитесь, что вы подключили правильный компонент EntityManager в случае, если в приложении установлено 2 или более.

@PersistenceContext(unitName = "<persistent-unit-name>") 
    private EntityManager entityManager; 


    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" > 
     <property name="persistenceUnitName" value="<persistent-unit-name>" /> 
    ... 
    </bean> 
2

Его совершенно неправильно, но, все ваши EntityManager экземпляры будут создавать с EntityManagerFactoryBean. Если вы создали этот @Bean, это не гарантирует, что у вас есть тот же экземпляр EntityManager.