java - 每个 DAO 中的 EntityManager 配置

标签 java spring jakarta-ee jpa eclipselink

我知道这是一个很长的问题,但我想问所有的问题,因为我 坚持这些事情超过 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是Spring注入(inject)的吗? (我知道 @PersistenceContext 是一个 J2EE注解,所以想知道是不是没有Spring贡献的注入(inject))。

  2. 正如我已经提到的,我已经在所有 DAO 类中注入(inject)了 EntityManager。是 这是一个好习惯吗?或者我应该通过像这样的单独类(class)来使它成为单例 PersistenceManager,它有 EntityManager 属性连线,并且有 getEntityManager() 方法?

  3. 正如您在上面看到的,我已经配置了 Spring 事务。但是当我做 CRUD 时 连续运行 2-3 次,应用程序卡住并使用 EclipseLink 失败 异常说无法获得锁定,超时等。我在这里做错了什么还是 缺少任何交易配置??

  4. 通过上面的配置,我只能默认使用@Transactional注解 值为 PROPAGATION_REQUIRED,ISOLATION_DEFAULT。如果我将这些更改为任何其他 值,例如 @Transactional(PROPAGATION_REQUIRED,ISOLATION_SERIALIZABLE) 等, 应用程序抛出异常,因为不支持自定义隔离级别。再一次,我 我缺少任何配置吗?

    谢谢。

最佳答案

  1. 是的,spring 识别 @PersistenceContext注释并注入(inject)实体管理器
  2. Spring 负责处理 - 它注入(inject)相同的 EntityManager所有 DAO 中的实例。事实上,它注入(inject)了一个代理,以便每个请求使用不同的实体管理器。
  3. 通常一切都应该运行良好。你需要<tx:annotation-driven />为了使用 @Transactional
  4. JPA 仅支持默认隔离级别。您可以通过自定义 spring jpa 方言来解决此问题,但没有内置任何内容。要走的路是扩展XJpaDialect (在您的情况下 X=EclipseLink),覆盖 beingTransaction , 获取 Connection (以 eclipse 链接特定的方式),设置所需的隔离级别(可通过事务定义访问),并将其配置为您的 LocalContainerEntityManagerFactoryBean 的属性:

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

关于java - 每个 DAO 中的 EntityManager 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7338317/

相关文章:

java.sql.SQLException : Method org. postgresql.jdbc3.Jdbc3PreparedStatement.setQueryTimeout(int) 尚未实现

java - Maven 插件 - 编辑目标中的文件(war)

java - 使用 DnD 在 JPanel 中移动和重新排序 JLabel

java - SLF4J:SimpleLogger 不记录跟踪和调试,也不记录异常

java - 布局之间的淡入淡出效果

performance - 从网站性能的角度来看,DTO 有哪些优点和缺点?

java - 此代码背后的逻辑解释 - Java

java - 如何阻止文件导航超出某个目录?

Spring Security 拦截 url 角色

java - x 天后使用 Spring 运行一次任务