Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 434|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    昨天 22:25
  • 签到天数: 790 天

    [LV.10]以坛为家III

    2049

    主题

    2107

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    722766
    发表于 2021-4-30 15:58:44 | 显示全部楼层 |阅读模式
    

    在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种方法都測试通过。


    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-9-11 22:38 , Processed in 0.065019 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表