【已解決】persistence.xml和entity類不在同一jar包,致使找不到實體

問題描述: java

JPA會自動讀取同一jar包下,標註@Entity的實體類。可是若是所使用的實體和persistent.xml不在同一jar包時,會讀取不到,而致使IllegalArgumentException: Not an managed type: class foo.bar spring


解決方案1: 模塊化

在persistence.xml明確指定須要被JPA管理的實體。以下: 測試

<?xml version="1.0" encoding="UTF-8"?>
<persistence xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/persistence">
    <persistence-unit transaction-type="RESOURCE_LOCAL" name="persistenceUnit">
        <class>foo.bar1</class>
        <class>foo.bar2</class>
    </persistence-unit>
</persistence>


這種方法的缺點很明顯。既然是persistence.xml和entity類,那麼項目就確定是分紅了多個模塊,或者是運行測試用例。可是要想找到實體,仍然須要集中修改persistence.xml。這樣並非真正的模塊化,還需集中處理各個業務對象。 spa


解決方案2: code

使用Spring管理JPA。在3.0以上的版本中(具體忘了是3.0.幾開始支持的了),用org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean,配置packagesToScan屬性,Spring會自動掃描並加載該包及其子包下全部的@Entity。 orm

之前一直知道這個方法,可是每次試都不起做用,懷疑是Spring的一個BUG。今天靜下心來讀了一下這塊的源碼,發現若是要讓這個屬性起做用,就必定不能配置persistenceXmlLocation屬性。persistenceXmlLocation用來指定persistence.xml的位置,若是指定這個屬性,Spring就不會徹底託管JPA。如今,刪除這個屬性,就意味着能夠把persistence.xml文件也一併刪掉了。 xml

配置示例: 對象

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="packagesToScan" value="${base.package.name}" />
    <property name="dataSource" ref="dataSource" />
    <property name="jpaVendorAdapter">
	<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" 
	    p:showSql="true" 
	    p:generateDdl="true" 
	    p:databasePlatform="${database.platform}" 
	/>
    </property>
</bean>
相關文章
相關標籤/搜索