浏览 7424 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-02-28
最后修改:2009-08-01
1.使用LocalContainerEntityManagerFactoryBean 2.可能存在多个persistence.xml,比如5个以上,每个persistence.xml定义的class不同 想一下就能切换好实现: entityManagerFactory的定义放在一个文件就叫ormContext.xml吧,包含下面内容 配置一: <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> 使用ormContext.xml的配置文件如下: <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> PersistenceClassesConfigProcessor的实现: 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; } } persistence.xml就不需要再指定class了,而可以只修改配置一一处地方来切换jpa的实现。 朋友问我为什么不在一个persistence.xml定义所有需要持久化的类呢?我想想我的确有点没事找事干了. 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-03-02
跟你一样的想法的人,大有人在,有时候为了减少配置文件的数量,不得已直接使用代码进行配置,或者集中一种地方进行配置。避免有时候遗忘了哪个文件忘了改。
|
|
返回顶楼 | |
发表时间:2007-04-12
在把openjpa部署到weblogic10上时,也遇到不同jpa之间的配置切换。
后来找到个简单的方法,就是写个 persistenceUnitPostProcessor. 同楼主的方法一样,只需在applicationContext.xml中指定ManagedClasses,不再需要persistence.xml。 |
|
返回顶楼 | |