簡體   English   中英

每個DAO中的EntityManager配置

[英]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>

我對自己的所作所為感到困惑:

  1. 是否由Spring注入了EntityManager (我知道@PersistenceContext是一個J2EE注釋,所以想知道它是否是在沒​​有Spring貢獻的情況下注入的)。

  2. 正如我已經提到的,我已經在所有DAO類中注入了EntityManager 這是一個好習慣嗎? 或者我應該通過具有像PersistenceManager這樣的單獨類來使其成為Singleton,它具有連接的EntityManager屬性,並且具有getEntityManager()方法?

  3. 如您所見,我已配置Spring事務。 但是當我連續2-3次進行CRUD操作時,應用程序卡住並因EclipseLink異常而無法獲得鎖定,超時等失敗。我在這里做錯了什么或者丟失了任何事務配置?

  4. 使用上述配置,我只能使用@Transactional注釋,其默認值為PROPAGATION_REQUIRED,ISOLATION_DEFAULT 如果我為任何其他值更改這些值,例如@Transactional(PROPAGATION_REQUIRED,ISOLATION_SERIALIZABLE)等,則應用程序會拋出異常,因為不支持自定義隔離級別。 我再次錯過了任何配置嗎?

    謝謝。

  1. 是的,spring識別@PersistenceContext注釋並注入實體管理器
  2. Spring負責這一點 - 它在所有DAO中注入相同的EntityManager實例。 實際上,它會注入一個代理,以便每個請求使用不同的實體管理器。
  3. 通常一切都應該運行正常。 您需要<tx:annotation-driven />才能使用@Transactional
  4. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM