您的位置:首页 > 编程语言 > Java开发

Spring集成JPA后,报“Not an managed type: class x.x.x"

2015-08-01 18:27 711 查看
以前的Spring脚手架项目,因业务需要,是基于多数据源 and不同方言的数据库的,对于普通项目过于复杂了,

于是重新搭了个单数据源的,用STS新建完毕,这是项目目录,





加上配置之后,先列下application-db-config.xml文件,它提供了spring集成jpa的配置,当然这一版是有点小问题的,下面我们来看

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx" 
           xsi:schemaLocation="http://www.springframework.org/schema/beans 
                    http://www.springframework.org/schema/beans/spring-beans.xsd                              http://www.springframework.org/schema/context 
                             http://www.springframework.org/schema/context/spring-context.xsd                              http://www.springframework.org/schema/tx 
                       http://www.springframework.org/schema/tx/spring-tx.xsd"> 
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="${database1.driverClassName}"/>
        <property name="jdbcUrl" value="${database1.url}"/>               
        <property name="user" value="${database1.username}"/>
        <property name="password" value="${database1.password}"/>
        <property name="minPoolSize" value="10"/>
        <property name="maxPoolSize" value="80"/>
        <property name="maxIdleTime" value="1800"/>
        <property name="acquireIncrement" value="2"/>
        <property name="acquireRetryDelay" value="1000"/>
        <property name="maxStatements" value="0"/>
        <property name="initialPoolSize" value="20"/>
        <property name="idleConnectionTestPeriod" value="60"/>
        <property name="acquireRetryAttempts" value="30"/>
        <property name="breakAfterAcquireFailure" value="false"/>
        <property name="testConnectionOnCheckout" value="false"/>
        <property name="testConnectionOnCheckin" value="false"/>
    </bean>

    <bean id="jpaVendorAdapter"
        class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
        <property name="generateDdl" value="false" />
        <!-- <property name="showSql" value="false" /> -->
        <!-- <property name="database" value="MYSQL"/> -->
    </bean>   

    <!-- Class 'org.hibernate.ejb.HibernatePersistence' is marked deprecated -->
    <bean id="persistenceProvider" class="org.hibernate.jpa.HibernatePersistenceProvider"/>

    <bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="persistenceXmlLocation" value="classpath:persistence.xml"/>
        <property name="persistenceUnitName" value="persistenceUnit" />
        <property name="persistenceProvider" ref="persistenceProvider"/>
        <property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
        <property name="jpaDialect" ref="jpaDialect"/>
        <property name="packagesToScan">
            <list>
                <value>com.buwei.webpageapp.domain</value>
            </list>
        </property>
        <property name="jpaProperties">  
            <props>  
                <prop key="hibernate.show_sql">true</prop>  
                <prop key="hibernate.format_sql">false</prop> 
                <prop key="hibernate.hbm2ddl.auto">update</prop> 
                <prop key="hibernate.connection.charSet">UTF-8</prop> 
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>  
            </props>  
        </property>  
    </bean>       

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager" mode="aspectj"/>

</beans>
和 persistence.xml,让spring来完全管理JPA,所以此文件里不需要什么内容,
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
    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_2_0.xsd">     <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL"/>
</persistence>
然后运行单元测试,我的dao是由Spring Data JPA完成的,报了个”Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'systemLogRepository'“







我第一反应时候,这个domain包里的Entity没有被扫描到吗,经过baidu 和 Stack Overflow一番,有说

如果配置了 packagesToScan,就不能配置persistenceUnitName,否则packagesToScan会完全不起作用,

详解可以参考 http://www.cnblogs.com/taven/archive/2013/10/04/3351841.html

把persistenceUnitName注释后的再运行单元测试,还是报错,

”javax.validation.ValidationException: HV000183: Unable to load 'javax.el.ExpressionFactory'. Check that you have the EL dependencies on the classpath, ......“





似乎是少了el依赖,于是在pom文件中加上




<dependency>
  <groupId>javax.el</groupId>
  <artifactId>javax.el-api</artifactId>
  <version>3.0.0</version>
</dependency>

<dependency>
  <groupId>org.glassfish</groupId>
  <artifactId>javax.el</artifactId>
  <version>3.0.0</version>
</dependency>
再运行单元测试,测试成功







数据插入成功,





同时把persistenceXmlLocation注释掉,这样不需要persistence.xml文件也不影响spring与jpa的集成,

但是persistence.xml的配置下得转移到entityManagerFactory的jpaProperties




<property name="jpaProperties">  
            <props>  
                <prop key="hibernate.show_sql">true</prop>  
                <prop key="hibernate.format_sql">false</prop> 
                <prop key="hibernate.hbm2ddl.auto">update</prop> 
                <prop key="hibernate.connection.charSet">UTF-8</prop> 
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>  
            </props>  
        </property>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: