前提:
1.使用LocalContainerEntityManagerFactoryBean
2.可能存在多个persistence.xml,比如5个以上,每个persistence.xml定义的class不同
想一下就能切换好实现:
entityManagerFactory的定义放在一个文件就叫ormContext.xml吧,包含下面内容
配置一:
[code]
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitManager" ref="persistenceUnitManager"/>
<property name="dataSource" ref="dataSource"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.RedSoftJpaVendorAdapter">
</bean>
</property>
</bean>
<bean id="persistenceUnitManager" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
<property name="persistenceXmlLocations">
<list>
<value>classpath*:/redsoft_jpa_persistence.xml</value>
</list>
</property>
</bean>[/code]
使用ormContext.xml的配置文件如下:
[code]<import resource="classpath*:/ormContext.xml"/>
<bean id="entityClasses" class="com.abest.util.PersistenceClassesConfigProcessor">
<property name="entityClassNames">
<list>
<value>com.abest.common.dao.TestBean</value>
<value>com.abest.uwin.baseinfo.domain.Region</value>
<value>com.abest.uwin.baseinfo.domain.Brand</value>
<value>com.abest.uwin.baseinfo.domain.MeasureUnit</value>
<value>com.abest.uwin.baseinfo.domain.ProductionFactory</value>
<value>com.abest.uwin.baseinfo.domain.MaterialType</value>
</list>
</property>
</bean>[/code]
PersistenceClassesConfigProcessor的实现:
[code]public class PersistenceClassesConfigProcessor extends InstantiationAwareBeanPostProcessorAdapter {
private static final String PERSISTENCE_UNIT_MANAGER = "persistenceUnitManager";
String beanNameOfpersistenceUnitManager = PERSISTENCE_UNIT_MANAGER;
private String[] entityClassNames;
public PersistenceClassesConfigProcessor() {
}
public Object postProcessAfterInitialization(Object object, String beanName) throws BeansException {
if(beanName.equals(beanNameOfpersistenceUnitManager)
&& object instanceof PersistenceUnitManager)
{
PersistenceUnitManager unitManager = (PersistenceUnitManager) object;
PersistenceUnitInfo unitInfo = unitManager.obtainDefaultPersistenceUnitInfo();
for (String entityClassName : entityClassNames) {
unitInfo.getManagedClassNames().add(entityClassName);
}
}
return object;
}
public void setEntityClassNames(String[] entityClassNames) {
this.entityClassNames = entityClassNames;
}
public void setBeanNameOfpersistenceUnitManager(String beanNameOfpersistenceUnitManager) {
this.beanNameOfpersistenceUnitManager = beanNameOfpersistenceUnitManager;
}
}[/code]
persistence.xml就不需要再指定class了,而可以只修改配置一一处地方来切换jpa的实现。
朋友问我为什么不在一个persistence.xml定义所有需要持久化的类呢?我想想我的确有点没事找事干了.
1.使用LocalContainerEntityManagerFactoryBean
2.可能存在多个persistence.xml,比如5个以上,每个persistence.xml定义的class不同
想一下就能切换好实现:
entityManagerFactory的定义放在一个文件就叫ormContext.xml吧,包含下面内容
配置一:
[code]
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitManager" ref="persistenceUnitManager"/>
<property name="dataSource" ref="dataSource"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.RedSoftJpaVendorAdapter">
</bean>
</property>
</bean>
<bean id="persistenceUnitManager" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
<property name="persistenceXmlLocations">
<list>
<value>classpath*:/redsoft_jpa_persistence.xml</value>
</list>
</property>
</bean>[/code]
使用ormContext.xml的配置文件如下:
[code]<import resource="classpath*:/ormContext.xml"/>
<bean id="entityClasses" class="com.abest.util.PersistenceClassesConfigProcessor">
<property name="entityClassNames">
<list>
<value>com.abest.common.dao.TestBean</value>
<value>com.abest.uwin.baseinfo.domain.Region</value>
<value>com.abest.uwin.baseinfo.domain.Brand</value>
<value>com.abest.uwin.baseinfo.domain.MeasureUnit</value>
<value>com.abest.uwin.baseinfo.domain.ProductionFactory</value>
<value>com.abest.uwin.baseinfo.domain.MaterialType</value>
</list>
</property>
</bean>[/code]
PersistenceClassesConfigProcessor的实现:
[code]public class PersistenceClassesConfigProcessor extends InstantiationAwareBeanPostProcessorAdapter {
private static final String PERSISTENCE_UNIT_MANAGER = "persistenceUnitManager";
String beanNameOfpersistenceUnitManager = PERSISTENCE_UNIT_MANAGER;
private String[] entityClassNames;
public PersistenceClassesConfigProcessor() {
}
public Object postProcessAfterInitialization(Object object, String beanName) throws BeansException {
if(beanName.equals(beanNameOfpersistenceUnitManager)
&& object instanceof PersistenceUnitManager)
{
PersistenceUnitManager unitManager = (PersistenceUnitManager) object;
PersistenceUnitInfo unitInfo = unitManager.obtainDefaultPersistenceUnitInfo();
for (String entityClassName : entityClassNames) {
unitInfo.getManagedClassNames().add(entityClassName);
}
}
return object;
}
public void setEntityClassNames(String[] entityClassNames) {
this.entityClassNames = entityClassNames;
}
public void setBeanNameOfpersistenceUnitManager(String beanNameOfpersistenceUnitManager) {
this.beanNameOfpersistenceUnitManager = beanNameOfpersistenceUnitManager;
}
}[/code]
persistence.xml就不需要再指定class了,而可以只修改配置一一处地方来切换jpa的实现。
朋友问我为什么不在一个persistence.xml定义所有需要持久化的类呢?我想想我的确有点没事找事干了.