如何在Spring中以编程方式获取entitymanager?

weixin_38088241 2019-09-12 01:34:01
我正在尝试将我们的DAO maven模块集成到spring,我们不想更改dao的任何代码.以前,所有dao类都使用以下方式获取实体管理器. Persistence.getEntityManager() 在春天,我看到许多使用注释注入实体管理器的示例,但需要在dao代码中进行更改.有没有办法可以修改下面的类让它在春天工作? public class PersistenceManager { /** * Key that stores the entity manager. */ private static final String ENTITY_MANAGER_INSTANCE = "ENTITY_MANAGER_INSTANCE"; /** * Persistence unit for eMyEd */ private static final String PERSISTENCE_UNIT_EMYED = "application_openjpa"; /** * The static factory used across the JVM */ private static final EntityManagerFactory ENTITY_MANAGER_FACTORY = Persistence .createEntityManagerFactory(PERSISTENCE_UNIT_EMYED); /** * Cleanup any entity managers created in the thread context. */ public static void close() { EntityManager emInstance = getEntityManager(); try { if (emInstance.isOpen()) { emInstance.close(); } } catch (Throwable t) { // ignore } finally { ThreadContext.instance.clear(); } } /** * Returns the Entity manager associated with the given thread context. If * none available, one is created and set on the thread context and the same * is returned. * * @return */ public static EntityManager getEntityManager() { EntityManager emInstance = (EntityManager) ThreadContext.instance .get(ENTITY_MANAGER_INSTANCE); if (emInstance == null) { emInstance = createEntityManager(); emInstance.setFlushMode(FlushModeType.COMMIT); ThreadContext.instance.put(ENTITY_MANAGER_INSTANCE, emInstance); } try { // try to join the current active transaction emInstance.joinTransaction(); } catch (TransactionRequiredException notSupportedEx) { // If there was no transaction to join. Ignore } catch (Throwable unknownEx) { // If there was no transaction to join. Ignore } return emInstance; } /** * Create a new entity manager. * * @return */ private static EntityManager createEntityManager() { return ENTITY_MANAGER_FACTORY.createEntityManager(); } } 弹簧配置 <description>Example configuration to get you started.</description> <context:component-scan base-package="com.veera" /> <!-- tell Spring that it should act on any @PersistenceContext and @Transactional annotations found in bean classes --> <tx:annotation-driven transaction-manager="transactionManager" /> <!-- ******************************************************************** --> <!-- Setup the transaction manager --> <!-- ******************************************************************** --> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <!-- ******************************************************************** --> <!-- Setup each data source --> <!-- ******************************************************************** --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/test" /> <property name="username" value="root" /> <property name="password" value="root" /> </bean> <!-- ******************************************************************** --> <!-- Setup each persistence unit --> <!-- ******************************************************************** --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter"> <property name="databasePlatform" value="org.apache.openjpa.jdbc.sql.MySQLDictionary" /> </bean> </property> <property name="persistenceUnitName" value="application_openjpa" /> <!-- property name="loadTimeWeaver"> <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" /> </property --> <!-- property name="jpaProperties"> <props> <prop key="hibernate.hbm2ddl.auto">create-drop</prop> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> </props> </property --> </bean> <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> persistence.xml中 <persistence-unit name="application_openjpa" transaction-type="RESOURCE_LOCAL"> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> <class>com.veera.jpa.Item</class> <class>com.veera.jpa.Order</class> <class>com.zreflect.emyed.entity.user.User</class> <exclude-unlisted-classes>true</exclude-unlisted-classes> <properties> <!-- property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema" / <property name="openjpa.InitializeEagerly" value="true"/--> <property name="openjpa.Log" value="File=stdout, DefaultLevel=INFO, Runtime=INFO, SQL=TRACE"/> </properties> </persistence-unit> </persistence>
...全文
132 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38094491 2019-09-12
  • 打赏
  • 举报
回复
由于定义中的EntityManager不是线程安全的,唯一 – 仍然是丑陋的 – 解决方案是静态保存EntityManagerFactory并根据请求从工厂创建EntityManager实例. 我甚至建议使用这种方法更改DAO以使用依赖注入原因,您的DAO本质上变得不可单一,而不需要引导整个JPA基础结构.

433

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧