我正在尝试将我们的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>
最佳答案 由于定义中的EntityManager不是线程安全的,唯一 – 仍然是丑陋的 – 解决方案是静态保存EntityManagerFactory并根据请求从工厂创建EntityManager实例.
我甚至建议使用这种方法更改DAO以使用依赖注入原因,您的DAO本质上变得不可单一,而不需要引导整个JPA基础结构.