论坛首页 Java企业应用论坛

使用spring集成ejb3 persistence实现,不需要在persistence.xml指定class的方法

浏览 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定义所有需要持久化的类呢?我想想我的确有点没事找事干了.

   发表时间:2007-03-02  
跟你一样的想法的人,大有人在,有时候为了减少配置文件的数量,不得已直接使用代码进行配置,或者集中一种地方进行配置。避免有时候遗忘了哪个文件忘了改。
0 请登录后投票
   发表时间:2007-04-12  
在把openjpa部署到weblogic10上时,也遇到不同jpa之间的配置切换。
后来找到个简单的方法,就是写个 persistenceUnitPostProcessor.
同楼主的方法一样,只需在applicationContext.xml中指定ManagedClasses,不再需要persistence.xml。

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics