春/休眠JPA NamedQuery没有找到

问题描述:

我有一个奇怪的问题:实体管理器不能创建命名查询,我得到java.lang.IllegalArgumentException: Named query not found而方法,如find()merge(),作品。 createQuery()也适用。我使用Hibernate作为JPA provider和Spring作为DI容器。代码和CONFIGS是如下:
弹簧的beans.xml
春/休眠JPA NamedQuery没有找到

<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-2.5.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-3.0.xsd"> 
<context:component-scan base-package="org.example.testapp.database" /> 
<bean id="newsForm" class="org.example.testapp.presentation.form.NewsForm"> 
    <property name="newsMessage" ref="news" /> 
    <property name="newsList"> 
     <list> 
      <ref bean="news" /> 
     </list> 
    </property> 
</bean> 

<bean name="news" class="org.example.testapp.model.News"> 
</bean> 

<bean name="/news" class="org.example.testapp.presentation.action.NewsAction" 
    scope="prototype"> 
    <property name="dao" ref="dao" /> 
</bean> 

<bean id="dao" class="org.example.testapp.database.dao.JpaHibernateNewsDao" 
    scope="singleton"> 
</bean> 

<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="packagesToScan" value="org.example.testapp.model"/> 
    <property name="jpaVendorAdapter" ref="jpaVendorAdapter" /> 
</bean> 

<bean id="jpaVendorAdapter" 
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
    <property name="database" value="ORACLE" /> 
    <property name="showSql" value="true" /> 
    <property name="generateDdl" value="false" /> 
    <property name="databasePlatform" value="org.hibernate.dialect.Oracle10gDialect" /> 
</bean> 

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> 
    <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" /> 
    <property name="username" value="login" /> 
    <property name="password" value="password" /> 
</bean> 

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

<context:annotation-config/> 
<tx:annotation-driven transaction-manager="transactionManager" /> 

news.java

@Entity 
@NamedQueries({ 
    @NamedQuery(name="News.select", query="select n from News n order by news_date"), 
    @NamedQuery(name="News.delete", query="delete from News where id in :value_list") 
}) 
@Table(name="news") 
public class News { 

jpadao.java

public class JpaHibernateNewsDao implements Dao { 

    @PersistenceContext 
    private EntityManager entityManager; 

    @SuppressWarnings("unchecked") 
    @Override 
    @Transactional 
    public List<News> getList() throws DaoException { 
     List<News> news = entityManager.createNamedQuery("News.select").getResultList(); 
     return news; 
    } 

找到了答案:Spring只是没有看到@Entity,所以确实没有这样的@NamedQuery。现在,我必须弄清楚,为什么这个配置没有工作:

<bean id="entityManagerFactory" 
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
<property name="dataSource" ref="dataSource" /> 
<property name="packagesToScan" value="org.example.testapp.model"/> 
<property name="jpaVendorAdapter" ref="jpaVendorAdapter" /> 

+0

嗨伊万,你有没有发现什么问题,因为我打相同。 Thx提前 – Anand 2016-07-31 10:44:49