2013-11-29 22 views
0

我正在嘗試在JPA中創建一個NamedQuery。不幸的是它由於以下原因而失敗:由於@NameQueries中的錯誤而無法實例化LocalContainerEntityManagerFactoryBean?

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/datasource.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build EntityManagerFactory 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1105) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:915) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:472) 
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:388) 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:293) 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111) 
    at com.ibm.ws.webcontainer.webapp.WebApp.notifyServletContextCreated(WebApp.java:2220) 
    ... 1 more 
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build EntityManagerFactory 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:914) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:890) 
    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:73) 
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:287) 
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452) 
    ... 14 more 
Caused by: org.hibernate.HibernateException: Errors in named queries: searchByUsername 
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:489) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1737) 
    at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:76) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:905) 
    ... 20 more 

每當Web應用程序加載時都會發生此問題。我認爲錯誤來自@NamedQuery,如果我刪除它,它會正常工作。以下是POJO類的代碼片段。

@NamedQueries({ 
    @NamedQuery(
     name="searchByUsername", 
     query="select e from users u where u.username in (select a.username from authorities a where a.username = :username)" 
    ) 
}) 
@Entity 
@Table(name="users") 
public class User { 
    @Transient 
    private String firstName; 

    @Transient 
    private String lastName; 

    @Id 
    @Column(name="username") 
    private String username; 

    @Column(name="password") 
    private String password; 

    @Column(name="enabled") 
    private Boolean enabled; 

    @Transient 
    private Role role; 
} 

這是DAO類,負責就查詢電話:

@Repository 
public class UserDao { 
    @PersistenceUnit 
    private EntityManagerFactory emf; 

    public User findByUsername(String username) { 
     try { 
      User l = (User) emf.createEntityManager().createNamedQuery("searchByUsername", org.huahsin.WebEngineering.User.class).setParameter("username", username).getResultList(); 

       ... 
      } 
      ... 

我不知道我是否想念在Spring配置任何東西,我只是把它這裏您參考:

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/> 

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
    <property name="url" value="jdbc:mysql://localhost:3306/test"/> 
    <property name="username" value="root"/> 
    <property name="password" value="abcd"/> 
</bean> 

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

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

回答

1

這就是命名查詢的優點:它們快速失敗。創建EntityManagerFactory時,將檢查所有已命名的查詢,並且如果其中一個查詢是無效查詢,則創建將失敗。

這允許立即檢測查詢中的錯誤,而不是等待它們在運行時執行。

JPQL使用實體及其字段的名稱。從來沒有表和他們的專欄的名稱。而您正在選擇e,它不符合查詢中的任何別名。

查詢應該是:

select u from User u where u.username in (select a.username from Authority a where a.username = :username) 
+0

只是好奇,在我的查詢我提到'users'這是表名,而您的查詢提到'User'這是一個實體。哪一個是正確的? – huahsin68

+0

你爲什麼不讀我的答案:* JPQL使用實體名稱和它們的字段。從來沒有表格名稱和他們的列。* –

+0

對不起,我應該至少讀了一千次答案,然後再問另一個。 – huahsin68

相關問題