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



在Spring 集成 Hibernate 的JPA方式中,需要在persistence配置文件中定义每一个实体类,这样非常地不方便,2种方法可以解决此问题:这2种方式都可以实现不用在persistence.xml文件中配置每一个实体类,,从而免去每个Entity都要在

方式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=""xmlns:xsi=""xsi:schemaLocation=""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 配置文件,去掉“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的解决办法

相关文章:

你感兴趣的文章:

标签云: