[英]EntityManager configuration in each DAO
我知道這是一個很長的問題,但我想問一切,因為我已經堅持這些東西超過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>
我對自己的所作所為感到困惑:
是否由Spring注入了EntityManager
? (我知道@PersistenceContext
是一個J2EE注釋,所以想知道它是否是在沒有Spring貢獻的情況下注入的)。
正如我已經提到的,我已經在所有DAO類中注入了EntityManager
。 這是一個好習慣嗎? 或者我應該通過具有像PersistenceManager
這樣的單獨類來使其成為Singleton,它具有連接的EntityManager
屬性,並且具有getEntityManager()
方法?
如您所見,我已配置Spring事務。 但是當我連續2-3次進行CRUD操作時,應用程序卡住並因EclipseLink異常而無法獲得鎖定,超時等失敗。我在這里做錯了什么或者丟失了任何事務配置?
使用上述配置,我只能使用@Transactional
注釋,其默認值為PROPAGATION_REQUIRED,ISOLATION_DEFAULT
。 如果我為任何其他值更改這些值,例如@Transactional(PROPAGATION_REQUIRED,ISOLATION_SERIALIZABLE)
等,則應用程序會拋出異常,因為不支持自定義隔離級別。 我再次錯過了任何配置嗎?
謝謝。
@PersistenceContext
注釋並注入實體管理器 EntityManager
實例。 實際上,它會注入一個代理,以便每個請求使用不同的實體管理器。 <tx:annotation-driven />
才能使用@Transactional
JPA僅支持默認隔離級別。 您可以通過自定義spring jpa方言來解決這個問題,但內置任何東西都沒有。 方法是擴展XJpaDialect
(在你的情況下是X = EclipseLink),覆蓋beingTransaction
,獲取Connection
(以eclipse-link特定方式),設置所需的隔離級別(可通過事務定義訪問),並將其配置為LocalContainerEntityManagerFactoryBean
的屬性:
<property name="jpaDialect"> <bean class="com.foo.util.persistence.EclipseLinkExtendedJpaDialect" /> </property>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.