日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/9/21 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 不在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種方法都測試通過。


總結

以上是生活随笔為你收集整理的不在JPA 的 persistence.xml 文件里配置Entity class的解决的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。