Конфигурация EntityManager в каждом DAO - PullRequest
4 голосов
/ 07 сентября 2011

Я понимаю, что это очень длинный вопрос, но я хотел задать все, потому что я застрял с этими вещами более 2 недель, и я нахожусь в ситуации, чтобы решить это в течение этой недели.Пожалуйста, помогите мне в этом.

Я использую EclipseLink jpa версии 2, Spring 3, jdk6, MySQL5 и tomcat7.

Я настроил следующее в каждом из моих классов DAO.

@PersistenceContext
private EntityManager em;

В моем Spring xml есть следующее:

<bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"  id="dataSource">
    <property name="url" value="jdbc:mysql://localhost:3306/xxxxx"/>
    <property name="username" value="xxxx"/>
    <property name="password" value="xxxx"/>
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
</bean>

<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/>
    <property name="jpaDialect" ref="jpaDialect"/>
</bean>

<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
    <property name="jpaDialect" ref="jpaDialect"/>
</bean>

<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter" >
    <property name="showSql" value="true"/>
    <property name="generateDdl" value="true" />
</bean>

<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect"/>

Из Persistence.xml:

<persistence-unit name="xxxxx" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<-- class mappings -->
</persistence-unit>

У меня мало путаницы в том, что у меня естьсделано:

  1. Вводится ли EntityManager пружиной?(Я понимаю, что @PersistenceContext является аннотацией J2EE, поэтому задаюсь вопросом, вводится ли она без вклада Spring).

  2. Как я уже упоминал, я вставил EntityManager во всеКлассы DAO.Это хорошая практика?или я должен сделать его Singleton, имея отдельный класс, такой как PersistenceManager, который имеет проводной атрибут EntityManager и имеет метод getEntityManager()?

  3. Как вы можете видеть выше, янастроили весенние транзакции.Но когда я выполняю операции CRUD непрерывно в течение 2-3 раз, приложение застревает и завершается с ошибкой EclipseLink, сообщающей, что невозможно получить блокировку, тайм-аут и т. Д. Я делаю что-то здесь неправильно или отсутствует какая-либо конфигурация транзакции ??1034 *

    В описанных выше конфигурациях я могу использовать только аннотацию @Transactional со значениями по умолчанию PROPAGATION_REQUIRED,ISOLATION_DEFAULT.Если я изменяю их для любых других значений, таких как @Transactional(PROPAGATION_REQUIRED,ISOLATION_SERIALIZABLE) и т. Д., Приложение выдает исключение, поскольку пользовательские уровни изоляции не поддерживаются.Опять же, мне не хватает каких-либо конфигураций?

    Спасибо.

1 Ответ

8 голосов
/ 07 сентября 2011
  1. Да, Spring распознает аннотацию @PersistenceContext и внедряет менеджер сущностей
  2. Spring позаботится об этом - он внедряет один и тот же экземпляр EntityManager во все DAO. Фактически, он внедряет прокси, так что каждый запрос использует другого менеджера сущностей.
  3. Обычно все должно работать нормально. Вам нужно <tx:annotation-driven />, чтобы использовать @Transactional
  4. JPA поддерживает только уровень изоляции по умолчанию. Вы можете обойти это, настроив пружинный диалект jpa, но там нет ничего встроенного. Для этого нужно продлить XJpaDialect (в вашем случае X = EclipseLink), переопределить beingTransaction, получить Connection (определенным образом для затмения), установить желаемый уровень изоляции (доступный через определение транзакции ) и настройте его как свойство вашего LocalContainerEntityManagerFactoryBean:

    <property name="jpaDialect">
        <bean class="com.foo.util.persistence.EclipseLinkExtendedJpaDialect" />
    </property>
    
...