出現(xiàn)異常: java.lang.IllegalArgumentException: Not an managed type
spring+jpa框架整合出現(xiàn)問(wèn)題:
從svn checkout項(xiàng)目出來(lái)后,把環(huán)境搭配好,已經(jīng)可以把項(xiàng)目在Tomcat中跑起來(lái)了
但是在用Junit做單元測(cè)試的時(shí)候出現(xiàn)問(wèn)題,一直報(bào)錯(cuò):
java.lang.IllegalStateException: Failed to load ApplicationContext
看完完整的報(bào)錯(cuò)信息發(fā)現(xiàn)原因是:
Caused by: java.lang.IllegalArgumentException: Not an managed type: class com.csl.mmscm.model.user.Account
原來(lái)是jpa找不到實(shí)體類(lèi),可是我都能在Tomcat中完好跑,照理說(shuō)應(yīng)該不用怎么處理了的。
在網(wǎng)上找了兩天,終于是發(fā)現(xiàn)解決辦法了:
原來(lái)spring data jpa在applicationContext.xml里面的配置是這樣的:
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
id="entityManagerFactory">
<property name="persistenceUnitName" value="persistenceUnit" />
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
<property name="packagesToScan" value="com.csl.mmscm.model.*" />
</bean>
這里面引用了persistenceUnit,這個(gè)其實(shí)就是引用了persistence.xml里面對(duì)應(yīng)的這里面引用了persistenceUnit,原來(lái)的persistence.xml配置如下:
<?xml version="1.0"?>
<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/persistence_1_0.xsd" version="1.0">
<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="hibernate.connection.driver_class" value="org.gjt.mm.mysqlDriver" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="!Cascade020" />
<property name="hibernate.connection.url" value="jdbc.mysql://localhost:3306/mmscm"/>
<property name="hibernate.max_fetch_depth" value="3" />
<property name="hibernate.show_sql" value="true" />
<!--<property name="hibernate.hbm2ddl.auto" value="create-drop"/>-->
</properties>
</persistence-unit>
</persistence>
在這里面需要使用一個(gè)<class>標(biāo)簽來(lái)引入jpa所需要的實(shí)體類(lèi),改為如下:
<?xml version="1.0"?>
<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/persistence_1_0.xsd" version="1.0">
<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
<class>com.csl.mmscm.model.user.Account</class>
<class>com.csl.mmscm.model.user.AccountSearchResult</class>
<class>com.csl.mmscm.model.user.LoginSession</class>
<class>com.csl.mmscm.model.user.SysUser</class>
<class>com.csl.mmscm.model.user.SysUserId</class>
<class>com.csl.mmscm.model.user.UserAccessId</class>
<class>com.csl.mmscm.model.user.UserAccessRight</class>
<class>com.csl.mmscm.model.user.UserAlphaSa</class>
<class>com.csl.mmscm.model.user.UserSa</class>
<class>com.csl.mmscm.model.campaign.BatchMms</class>
<class>com.csl.mmscm.model.campaign.BatchMmsId</class>
<class>com.csl.mmscm.model.parameter.AccountParam</class>
<class>com.csl.mmscm.model.parameter.AccountParamId</class>
<class>com.csl.mmscm.model.parameter.SysParam</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="hibernate.connection.driver_class" value="org.gjt.mm.mysqlDriver" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="!Cascade020" />
<property name="hibernate.connection.url" value="jdbc.mysql://localhost:3306/mmscm"/>
<property name="hibernate.max_fetch_depth" value="3" />
<property name="hibernate.show_sql" value="true" />
<!--<property name="hibernate.hbm2ddl.auto" value="create-drop"/>-->
</properties>
</persistence-unit>
</persistence>
修改完成后就沒(méi)有報(bào)錯(cuò)了,單元測(cè)試成功,可以使用jpa查詢到數(shù)據(jù)庫(kù)中的數(shù)據(jù)。