0 0

spring3.2.2+jpa整合 如何配置多个持久化单元5

 

 <!-- 配置持久化单元文件  -->
 <bean id="pum"
  class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
  <property name="persistenceXmlLocations">
   <!-- 可以配置多个持久单元-->
   <list>
                   <!-- 持久单元名称 Test -->
       <value>classpath:config/common/persistences.xml</value>
          <!-- 持久单元名称 coldIce -->
        <value>classpath*:META-INF/persistence.xml</value>
   </list> 
  
  </property>

  <!-- 单配置多个持久单元的时候可以配置多个数据库连接池  -->
  <!--  <entry key="remoteDataSource" value-ref="dataSource" />  -->
  <property name="dataSources">
  
   <map>
    <entry key="localDataSource" value-ref="dataSource" />
   
   </map>
  </property>
  
  <!--配置默认的数据源 -->
    <property name="defaultDataSource" ref="dataSource" />
  
 </bean>

     <!-- 创建jpa实体管理工厂 -->
 <bean id="entityManagerFactory"
  class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
      <!-- 存在一个或者多个持久单元的时候可以先配置持久单元块 然后再进行引用 -->
        <!-- 为什这里已经参照了上面的持久话资源配置,底下还要指定一个具体的持久话单元名称,而且只能指定一个,那也就是说没法真正的配置多个持久化单元?????   -->
    <property name="persistenceUnitManager" ref="pum" />
     
        <!--   这里只能指定一个持久化单元  ,如果不指定 它就去自动去找一个默认的持久化单元,名称 为     “default”  然后系统就报错-->
        <!--  
          <property name="persistenceUnitName" value="Test"/>
          <property name="persistenceUnitName" value="coldIce"/>
          -->
        
        
          <!-- 只有一个持久单元的的时候可以直接在这里配置引用
            
  <property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml"/>
  <property name="dataSource" ref="dataSource"/>  -->
     
        <property name="jpaProperties">
            <props>
                 <prop key="javax.persistence.validation.mode">none</prop>
            </props>
         </property>
 </bean>
 
 <!-- 事物管理器,引用entityManagerFactory对象,并对它进行管理 -->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
       <property name="entityManagerFactory" ref="entityManagerFactory" />
   
    </bean>
      <!-- 使用注解方式来使用声明事物   -->
      <!-- 代理目标对象必须设置为 true 要不然sprig 注入的业务代理bean  就没有办法进行对象上转-->
    <tx:annotation-driven transaction-manager="transactionManager"  proxy-target-class="true"/>

 

请大家多多赐教谢谢!!

2013年4月03日 17:02

3个答案 按时间排序 按投票排序

0 0

使用persistenceUnitPostProcessor合并多个持久化单元:

//PersistenceUnitPostProcessor实现类,用于修改PersistenceUnitManager读取到的各个对应persistence.xml产生的PersistenceUnitInfo

package com.iwt.common.persist.jpa;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.orm.jpa.persistenceunit.MutablePersistenceUnitInfo;
import org.springframework.orm.jpa.persistenceunit.PersistenceUnitPostProcessor;

import com.iwt.common.util.CommonUtil;

/**
 * 合并多个JAR中的JPA实体到一个持久化单元
 * <p>
 * This merges all JPA entities from multiple jars. To use it, all entities must be listed in their respective
 * persistence.xml files using the <class> tag.
 * 
 * @see http://forum.springsource.org/showthread.php?t=61763 a
 * @see http://javathoughts.capesugarbird.com/2009/02/jpa-and-multiple-persistence -units.html b
 */
public class MergingPersistenceUnitPostProcessor implements PersistenceUnitPostProcessor {
    Map<String, List<String>> puiClasses = new HashMap<String, List<String>>();

    String persistenceUnitName; //最终返回的持久化单元名字
    List<String> includePersistenceUnitNames; //需要过滤的持久化单元名称列表

    public MergingPersistenceUnitPostProcessor() {}

    public void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui) {

        String pun = pui.getPersistenceUnitName();
        System.out.println(pun);
        if(!includePersistenceUnitNames.contains(pun)) {
            pui.getManagedClassNames().clear();
        }
        
        List<String> classes = puiClasses.get(pun);
        if (classes == null) {
            classes = new ArrayList<String>();
            puiClasses.put(pun, classes);
        }

        for (List<String> subClasses : puiClasses.values()) {
            pui.getManagedClassNames().addAll(subClasses);
        }

        final List<String> names = pui.getManagedClassNames();
        classes.addAll(names);
        pui.setPersistenceUnitName(persistenceUnitName);
        
        
        System.out.println("---------------------------------------------------------------");
        System.out.println(pui);
        for (String cn : names) {
            System.out.println(cn);
        }
        System.out.println("---------------------------------------------------------------");
    }

    public void scanEntity() {}

    //--------------------------------------------set-----------------------------------------------
    public void setIncludePersistenceUnitNames(List<String> includePersistenceUnitNames) {
        CommonUtil.checkArgument(includePersistenceUnitNames == null || includePersistenceUnitNames.isEmpty(), "需要合并的持久化单元名称列表不能为空!");
        this.includePersistenceUnitNames = includePersistenceUnitNames;
    }

    public void setPersistenceUnitName(String persistenceUnitName) {
        CommonUtil.checkArgument(persistenceUnitName == null || persistenceUnitName.isEmpty(), "合并后的持久化单元名称不能为空!");
        this.persistenceUnitName = persistenceUnitName;
    }
}


配置方法:

<bean id=" persistenceUnitPostProcessor "
	class="com.iwt.common.persist.jpa.MergingPersistenceUnitPostProcessor">
	<!--需要合并的持久化单元名称列表,不能为空 -->
	<property name="includePersistenceUnitNames">
		<list value-type="java.lang.String" >
			<value>huskyPU</value>
			<value>huicardPU</value>
			<value>huimerchantPU</value>
			<value>taskCenterPU</value>
		</list>
	</property>
<!-- 最终返回的持久化单元名字,不能为空且需要与 entityManagerFactory的persistenceUnitName相同-->
	<property name="persistenceUnitName" value="hui10PU" />
</bean>	
	

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
	<property name="dataSource" ref="dataSource"/>
	<property name="persistenceUnitName" value="hui10PU" />
	<property name="jpaVendorAdapter">
		<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
			<property name="showSql" value="false" />
		</bean>
	</property>
<!-- Callback interface for post-processing a JPA PersistenceUnitInterface -->
 		<property name="persistenceUnitPostProcessors" ref="persistenceUnitPostProcessor"/>
</bean>

2013年8月16日 14:06
0 0

//PersistenceUnitPostProcessor实现类,用于修改PersistenceUnitManager读取到的各个对应persistence.xml产生的PersistenceUnitInfo

package com.iwt.common.persist.jpa;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.orm.jpa.persistenceunit.MutablePersistenceUnitInfo;
import org.springframework.orm.jpa.persistenceunit.PersistenceUnitPostProcessor;

import com.iwt.common.util.CommonUtil;

/**
 * 合并多个JAR中的JPA实体到一个持久化单元
 * <p>
 * This merges all JPA entities from multiple jars. To use it, all entities must be listed in their respective
 * persistence.xml files using the <class> tag.
 * 
 * @see http://forum.springsource.org/showthread.php?t=61763 a
 * @see http://javathoughts.capesugarbird.com/2009/02/jpa-and-multiple-persistence -units.html b
 */
public class MergingPersistenceUnitPostProcessor implements PersistenceUnitPostProcessor {
    Map<String, List<String>> puiClasses = new HashMap<String, List<String>>();

    String persistenceUnitName; //最终返回的持久化单元名字
    List<String> includePersistenceUnitNames; //需要过滤的持久化单元名称列表

    public MergingPersistenceUnitPostProcessor() {}

    public void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui) {

        String pun = pui.getPersistenceUnitName();
        System.out.println(pun);
        if(!includePersistenceUnitNames.contains(pun)) {
            pui.getManagedClassNames().clear();
        }
        
        List<String> classes = puiClasses.get(pun);
        if (classes == null) {
            classes = new ArrayList<String>();
            puiClasses.put(pun, classes);
        }

        for (List<String> subClasses : puiClasses.values()) {
            pui.getManagedClassNames().addAll(subClasses);
        }

        final List<String> names = pui.getManagedClassNames();
        classes.addAll(names);
        pui.setPersistenceUnitName(persistenceUnitName);
        
        
        System.out.println("---------------------------------------------------------------");
        System.out.println(pui);
        for (String cn : names) {
            System.out.println(cn);
        }
        System.out.println("---------------------------------------------------------------");
    }

    public void scanEntity() {}

    //--------------------------------------------set-----------------------------------------------
    public void setIncludePersistenceUnitNames(List<String> includePersistenceUnitNames) {
        CommonUtil.checkArgument(includePersistenceUnitNames == null || includePersistenceUnitNames.isEmpty(), "需要合并的持久化单元名称列表不能为空!");
        this.includePersistenceUnitNames = includePersistenceUnitNames;
    }

    public void setPersistenceUnitName(String persistenceUnitName) {
        CommonUtil.checkArgument(persistenceUnitName == null || persistenceUnitName.isEmpty(), "合并后的持久化单元名称不能为空!");
        this.persistenceUnitName = persistenceUnitName;
    }
}

2013年8月16日 14:04
0 0

//PersistenceUnitPostProcessor实现类,用于修改PersistenceUnitManager读取到的各个对应persistence.xml产生的PersistenceUnitInfo

package com.iwt.common.persist.jpa;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.orm.jpa.persistenceunit.MutablePersistenceUnitInfo;
import org.springframework.orm.jpa.persistenceunit.PersistenceUnitPostProcessor;

import com.iwt.common.util.CommonUtil;

/**
* 合并多个JAR中的JPA实体到一个持久化单元
* <p>
* This merges all JPA entities from multiple jars. To use it, all entities must be listed in their respective
* persistence.xml files using the <class> tag.
*
* @see http://forum.springsource.org/showthread.php?t=61763 a
* @see http://javathoughts.capesugarbird.com/2009/02/jpa-and-multiple-persistence -units.html b
*/
public class MergingPersistenceUnitPostProcessor implements PersistenceUnitPostProcessor {
    Map<String, List<String>> puiClasses = new HashMap<String, List<String>>();

    String persistenceUnitName; //最终返回的持久化单元名字
    List<String> includePersistenceUnitNames; //需要过滤的持久化单元名称列表

    public MergingPersistenceUnitPostProcessor() {}

    public void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui) {

        String pun = pui.getPersistenceUnitName();
        System.out.println(pun);
        if(!includePersistenceUnitNames.contains(pun)) {
            pui.getManagedClassNames().clear();
        }
       
        List<String> classes = puiClasses.get(pun);
        if (classes == null) {
            classes = new ArrayList<String>();
            puiClasses.put(pun, classes);
        }

        for (List<String> subClasses : puiClasses.values()) {
            pui.getManagedClassNames().addAll(subClasses);
        }

        final List<String> names = pui.getManagedClassNames();
        classes.addAll(names);
        pui.setPersistenceUnitName(persistenceUnitName);
       
       
        System.out.println("---------------------------------------------------------------");
        System.out.println(pui);
        for (String cn : names) {
            System.out.println(cn);
        }
        System.out.println("---------------------------------------------------------------");
    }

    public void scanEntity() {}

    //--------------------------------------------set-----------------------------------------------
    public void setIncludePersistenceUnitNames(List<String> includePersistenceUnitNames) {
        CommonUtil.checkArgument(includePersistenceUnitNames == null || includePersistenceUnitNames.isEmpty(), "需要合并的持久化单元名称列表不能为空!");
        this.includePersistenceUnitNames = includePersistenceUnitNames;
    }

    public void setPersistenceUnitName(String persistenceUnitName) {
        CommonUtil.checkArgument(persistenceUnitName == null || persistenceUnitName.isEmpty(), "合并后的持久化单元名称不能为空!");
        this.persistenceUnitName = persistenceUnitName;
    }
}

2013年8月16日 14:04

相关推荐

    Struts2.3.12+Spring3.2.2+Hibernate4.2.0框架配置

    在本文中,我们将深入探讨如何配置Struts2.3.12、Spring3.2.2和Hibernate4.2.0这三个组件。 1. **Struts2.3.12** Struts2是Apache软件基金会的一个开源MVC框架,用于构建基于Java Servlet的应用程序。它提供了强大...

    SSH(struts2.3.8+spring3.2.2+hibernate4.2.0)整合demo

    这个"SSH(struts2.3.8+spring3.2.2+hibernate4.2.0)整合demo"是一个示例项目,旨在帮助初学者理解如何将这三个框架协同工作,实现用户注册和用户列表的功能。 Struts2作为MVC(模型-视图-控制器)框架,主要负责...

    基于最新的SSH(Struts2.3.12+Spring3.2.2+Hibernate4.20)+ jquery EasyUI1.3.2的担保公司OA系统

    【标题】"基于最新的SSH(Struts2.3.12+Spring3.2.2+Hibernate4.20)+ jquery EasyUI1.3.2的担保公司OA系统"揭示了一个集成化的企业级应用框架,它用于开发担保公司的办公自动化(OA)系统。SSH指的是Struts2、...

    jbpm3.2.2+spring2.5+hibernate3.0+struts2.0

    jbpm3.2.2集成了持久化框架Hibernate,使得流程实例和相关数据可以方便地存储和检索。 【Spring2.5】 Spring是一个全面的Java企业级应用开发框架,2.5版本是其历史上的一个重要里程碑。它强调了依赖注入...

    spring framework 3.2.2的源码+build.xml

    总的来说,Spring Framework 3.2.2的源码分析涵盖了依赖注入、面向切面编程、事务管理、Web MVC、数据访问和测试等多个方面,对于想要深入理解Spring框架工作原理的开发者来说,是一份宝贵的资料。通过细致的研究,...

    structs+spring+hibernate整合jar包

    在IT领域,尤其是在Java开发中,`Struts2`、`Spring`和`Hibernate`是三...通过这样的整合,我们可以利用Struts2的强大控制层,Spring的灵活性和管理能力,以及Hibernate的持久化能力,构建出高效、稳定的Java Web应用。

    带事务回滚测试的SSH整合小案例(Spring 3.2+Hibernate 3.3+Struts 2.3)

    集成了Spring 3.2.2 Hibernate 3.3.2 Struts 2.3.4 用JPA的注解实现orm 不用创建数据库表 只需本机上有oracle即可 用JSR注解进行Spring的...用Spring Test整合Junit4 进行测试并自动事务回滚 不对数据库造成持久化操作

    spring 2.5.6和hibernate3.2.2集成(1)

    在IT行业中,Spring和Hibernate是两个非常...总之,Spring 2.5.6和Hibernate 3.2.2的集成涉及多个步骤,包括配置、对象映射、事务管理和代码编写。理解这些知识点有助于开发者构建健壮的、基于ORM的Java企业级应用。

    spring-3.2-lib

    Spring MVC提供了处理HTTP请求、渲染视图、组织业务逻辑和数据持久化的强大工具。 以下是这些库文件的详细说明: 1. **spring-core-3.2.2.RELEASE.jar**:这是Spring框架的核心库,包含了IoC(Inversion of ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    处理多个持久化单元 12.6.2. JpaTemplate 和 JpaDaoSupport 12.6.3. 基于原生的JPA实现DAO 12.6.4. 异常转化 12.6.5. 事务管理 12.6.6. JpaDialect III. Web 13. Web框架 13.1. 介绍 13.1.1. 与其他web框架的集成 ...

    Spring in Action(第二版 中文高清版).part2

    5.5 Spring和Java持久API 5.5.1 使用JPA模板 5.5.2 创建一个实体管理器工厂 5.5.3 建立使用JPA的DAO 5.6 Spring和iBATIS 5.6.1 配置iBATIS客户模板 5.6.2 建立基于iBATIS的DAO 5.7 缓存 5.7.1 配置缓存...

    ssm框架整合全部Jar包

    5. **spring-context-3.2.2.RELEASE.jar**:Spring上下文模块提供了环境感知的服务,如bean的定义、配置和生命周期管理,以及事件传播、国际化、任务调度等功能。 6. **mysql-connector-java-commercial-5.1.25-bin...

    Spring in Action(第二版 中文高清版).part1

    5.5 Spring和Java持久API 5.5.1 使用JPA模板 5.5.2 创建一个实体管理器工厂 5.5.3 建立使用JPA的DAO 5.6 Spring和iBATIS 5.6.1 配置iBATIS客户模板 5.6.2 建立基于iBATIS的DAO 5.7 缓存 5.7.1 配置缓存...

    Spring in Action(第2版)中文版

    5.5spring和java持久api 5.5.1使用jpa模板 5.5.2创建一个实体管理器工厂 5.5.3建立使用jpa的dao 5.6spring和ibatis 5.6.1配置ibatis客户模板 5.6.2建立基于ibatis的dao 5.7缓存 5.7.1配置缓存方案 5.7.2...

    SSH.rar_hibernate3.0

    Spring3.2.2作为服务层的核心,提供了依赖注入(DI)和面向切面编程(AOP)的能力,有助于降低组件间的耦合度。它还支持数据访问抽象,可以方便地集成Hibernate或其他持久化技术。Spring的ApplicationContext容器...

    JAVA程序开发大全---上半部分

    9.2.6 使用反向工程生成持久化对象、映射文件和DAO类 143 9.2.7 使用Hibernate功能 151 9.3 MyEclipse中Hibernate框架的高级操作 152 9.3.1 在Hibernate反向工程中定制映射关系 153 9.3.2 使用HQL编辑器 154 9.4 ...

    J2EE应用开发详解

    294 16.3.5 数据库连接池中使用JDBC 297 16.4 小结 302 第17章 ORM与Java持久化机制 303 17.1 ORM概述 303 17.2 域模型 304 17.3 实体域对象的持久化模式 304 17.4 JPA 305 17.4.1 实体 306 17.4.2 EntityManager ...

    ssh(三大框架)集成

    - **Spring Bean实例化异常**: 如果Spring Bean无法实例化,请检查配置文件是否已正确加载以及Bean的配置是否有误。 - **Spring Bean注入问题**: 若提示缺少set/get方法,则需在类中添加相应的set/get方法或使用注解...

    各种在线api

    版本5.0是其发展过程中的一个重要里程碑,提供了更为成熟的企业级服务,如EJB(Enterprise JavaBeans)、JPA(Java Persistence API)、JSF(JavaServer Faces)等,极大地简化了复杂应用的开发过程。 ### ...

Global site tag (gtag.js) - Google Analytics