• 不在JPA 的 persistence.xml 文件里配置Entity class的解决的方法


    

    在Spring 集成 Hibernate 的JPA方式中,须要在persistence配置文件里定义每个实体类。这样很地不方便。2种方法能够解决此问题:

    这2种方式都能够实现不用在persistence.xml文件里配置每个实体类,从而免去每个Entity都要在persistence.xml文件里配置的烦恼,可是这样的方式Entity实体类的主键字段注解@ID要放到 getXXX()方法上。否则不认。

    方式1:
    改动“LocalContainerEntityManagerFactoryBean”的配置,例如以下:
     

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">

    <property name="packagesToScan" value="com.sunitjy.model.entityName" />

    <property name="jpaVendorAdapter">

    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>

    </property>

    <property name="jpaProperties">

                <props>

                    <prop key="hibernate.connection.driver_class">${jdbc.driverClassName}</prop>

                    <prop key="hibernate.connection.url">${jdbc.url}</prop>

                    <prop key="hibernate.connection.username">${jdbc.username}</prop>

                    <prop key="hibernate.connection.password">${jdbc.password}</prop>

                    <prop key="hibernate.c3p0.min_size">10</prop>

                    <prop key="hibernate.hbm2ddl.auto">true</prop>

                    <prop key="hibernate.dialect">${hibernate.dialect}</prop>

                </props>

            </property>

    </bean>

    方式1没有使用 persistence 这个配置文件。注意咯!

    方式2:
    改动“LocalContainerEntityManagerFactoryBean”的配置,例如以下:
     

     <bean id="entityManagerFactory"
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <!--  <property name="persistenceUnitName" value="pro_persistence"></property>-->
      <property name="dataSource" ref="dataSource"></property>
      <property name="persistenceXmlLocation" value="classpath*:pro_core/jpa_persistence.xml"></property>
      <property name="packagesToScan">
       <list>
        <value>com.paic.lfex.model</value>
        <value>com.lfex.sdp.core.model</value>
        <value>com.paic.lfex.core.pro</value>
       </list>
      </property>
      <property name="jpaVendorAdapter">
       <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
      </property>
     </bean>

    persistence.xml配置文件内容:
     

    <persistence xmlns="http://java.sun.com/xml/ns/persistence"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
     version="1.0">
     <persistence-unit name="pro_persistence"
      transaction-type="RESOURCE_LOCAL">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
       <properties>
       <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
       <property name="current_session_context_class" value="thread" />
       <!--<property name="hibernate.hbm2ddl.auto" value="update" /> -->
       <!--<property name="hibernate.show_sql" value="true" />-->
       <!--<property name="hibernate.format_sql" value="true" />-->
      </properties>

     </persistence-unit>

    </persistence>

    方式2使用了 persistence 配置文件,去掉“persistenceUnitName”属性,加入“packagesToScan”属性。persistence.xml配置文件里的persistence-unit名字照样保留。可是 persistence 配置文件里不须要对实体类进行配置,会自己主动识别。

    为什么去掉“persistenceUnitName”属性就能够自己主动识别实体了呢?看一下Spring的源代码就知道了:

    类名:org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager

    代码段:


    private List<SpringPersistenceUnitInfo> readPersistenceUnitInfos() {

        List<SpringPersistenceUnitInfo> infos = new LinkedList<SpringPersistenceUnitInfo>();

        boolean buildDefaultUnit = (this.packagesToScan != null || this.mappingResources != null);

        PersistenceUnitReader reader = new PersistenceUnitReader(this.resourcePatternResolver, this.dataSourceLookup);

        SpringPersistenceUnitInfo[] readInfos = reader.readPersistenceUnitInfos(this.persistenceXmlLocations);

        for (SpringPersistenceUnitInfo readInfo : readInfos) {

            infos.add(readInfo);

            if (this.defaultPersistenceUnitName != null &&

                    this.defaultPersistenceUnitName.equals(readInfo.getPersistenceUnitName())) {

                buildDefaultUnit = false;

            }

        }

        if (buildDefaultUnit) {

            infos.add(buildDefaultPersistenceUnitInfo());

        }

        return infos;

    }

    注意看这个源代码的方法,defaultPersistenceUnitName 变量假设不为空。而且等于 persistence 配置文件里的持久化单元名称,则buildDefaultUnit就为false,buildDefaultUnit 假设为 false,是不会运行 buildDefaultPersistenceUnitInfo() 方法的,而 buildDefaultPersistenceUnitInfo() 方法是依据我们定义的 packagesToScan 去自己主动扫描Entity实体类的。

      

     注:我使用的是 Spring 3.2.3

     以上2种方法都測试通过。


  • 相关阅读:
    模板 无源汇上下界可行流 loj115
    ICPC2018JiaozuoE Resistors in Parallel 高精度 数论
    hdu 2255 奔小康赚大钱 最佳匹配 KM算法
    ICPC2018Beijing 现场赛D Frog and Portal 构造
    codeforce 1175E Minimal Segment Cover ST表 倍增思想
    ICPC2018Jiaozuo 现场赛H Can You Solve the Harder Problem? 后缀数组 树上差分 ST表 口胡题解
    luogu P1966 火柴排队 树状数组 逆序对 离散化
    luogu P1970 花匠 贪心
    luogu P1967 货车运输 最大生成树 倍增LCA
    luogu P1315 观光公交 贪心
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/6809745.html
Copyright © 2020-2023  润新知