Я понимаю, что это очень длинный вопрос, но я хотел задать все, потому что я застрял с этими вещами более 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>
У меня мало путаницы в том, что у меня естьсделано:
Вводится ли EntityManager
пружиной?(Я понимаю, что @PersistenceContext
является аннотацией J2EE, поэтому задаюсь вопросом, вводится ли она без вклада Spring).
Как я уже упоминал, я вставил EntityManager
во всеКлассы DAO.Это хорошая практика?или я должен сделать его Singleton, имея отдельный класс, такой как PersistenceManager
, который имеет проводной атрибут EntityManager
и имеет метод getEntityManager()
?
Как вы можете видеть выше, янастроили весенние транзакции.Но когда я выполняю операции CRUD непрерывно в течение 2-3 раз, приложение застревает и завершается с ошибкой EclipseLink, сообщающей, что невозможно получить блокировку, тайм-аут и т. Д. Я делаю что-то здесь неправильно или отсутствует какая-либо конфигурация транзакции ??1034 *
В описанных выше конфигурациях я могу использовать только аннотацию @Transactional
со значениями по умолчанию PROPAGATION_REQUIRED,ISOLATION_DEFAULT
.Если я изменяю их для любых других значений, таких как @Transactional(PROPAGATION_REQUIRED,ISOLATION_SERIALIZABLE)
и т. Д., Приложение выдает исключение, поскольку пользовательские уровни изоляции не поддерживаются.Опять же, мне не хватает каких-либо конфигураций?
Спасибо.