标签:java spring jpa java-ee 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>
我对自己的所作所为感到困惑:
> Spring是否注入了EntityManager? (我知道@PersistenceContext是一个
J2EE注释,因此想知道它是否在没有Spring的贡献下注入).
>正如我已经提到的,我已经在所有DAO类中注入了EntityManager.是
这是一个好习惯吗?或者我应该通过单独的类来使它成为单身人士
PersistenceManager,它具有连接的EntityManager属性,并且具有
getEntityManager()方法?
>正如您在上面所看到的,我已经配置了Spring事务.但是当我做CRUD时
操作持续2-3次,应用程序卡住并且使用EclipseLink失败
异常说无法获得锁定,超时等我在这里做错了什么
缺少任何交易配置?
>通过上述配置,我只能使用默认的@Transactional注释
值为PROPAGATION_REQUIRED,ISOLATION_DEFAULT.如果我改变其他任何
值,例如@Transactional(PROPAGATION_REQUIRED,ISOLATION_SERIALIZABLE)等,
应用程序抛出异常,因为不支持自定义隔离级别.再一次,我
我缺少任何配置?
谢谢.
解决方法:
>是的,spring识别@PersistenceContext注释并注入实体管理器
> Spring负责这一点 – 它在所有DAO中注入相同的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>
标签:java,spring,jpa,java-ee,eclipselink 来源: https://codeday.me/bug/20190610/1209782.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。