2011-06-09 128 views
1

我是Java EE的新手,在使用命名查詢時遇到了一些麻煩。我們使用JBoss 6和Hibernate 3.6(JPA 2.0)。實體通過註釋進行配置,而不是在persistence.xml:JBoss/Hibernate IllegalArgumentException:命名查詢未找到

@Entity 
@NamedQueries({ 
    @NamedQuery(name = "Node.findRootNodes", query = "SELECT n FROM Node n WHERE n.parent IS NULL OR n.parent = 0"), 
    ... 
}) 
public class Node implements Serializable { ... } 

當部署包含實體的罐子,JBoss的日誌告訴我們,該命名查詢勢必:

[org.hibernate.cfg.annotations.QueryBinder] Binding Named query: Node.findRootNodes => SELECT n FROM Node n WHERE n.parent IS NULL OR n.parent = 0 

不幸的是,使用指定的查詢時,我們總會遇到這樣一個IllegalArgumentException:

[com.NodeTest] null: javax.ejb.EJBException: java.lang.IllegalArgumentException: Named query not found: Node.findRootNodes 

使用命名查詢無狀態bean是在同一個罐子的節點實體。調用無狀態bean的應用程序部署在不同的war文件中。

有沒有人知道我做錯了什麼?謝謝您的回答。

下面是persistence.xml中:

<?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="testPU" transaction-type="JTA"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <jta-data-source>java:/main</jta-data-source> 
     <properties> 
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

回答

4

檢查什麼:

  • 如果您EntityManager是由代表正確的持久性單元
  • 是否您Entity實際處理的EntityManagerFactory創建由給定的持久性單元。嘗試加載具有給定ID的實體。
  • 其他命名查詢的其他實體是否發現

更新1:看來你的實體不被持久化單元裝載。請檢查您的persistence.xml並獲取<exclude-unlisted-classes>並將其刪除。休眠應該支持實體的自動檢測,但只是爲了驗證 - 列出你的類persistence.xml

更新2:確保您@Entity註釋其實是javax.persistence.Entity,而不是org.hibernate....

+0

EntityManager使用'@ PersistencUnit'注入。在__persistence.xml__中只定義了一個持久化單元。加載具有給定ID的實體失敗,出現'IllegalArgumentException:Unknown entity'。嗯......所以實體實際上不是由持久性單元處理的? – 2011-06-09 15:43:28

+0

是的。你需要使用@PersistenceContext btw注入它。爲其餘 - 檢查更新。 – Bozho 2011-06-09 15:47:34

+0

抱歉,當然我使用'@PearContextContext'注入,我嘗試了你的建議來列出persistence.xml中的實體類,但仍然是'未知實體'。順便說一句。我用persistence.xml – 2011-06-09 16:02:26

1

我可以通過移動解決這個問題war中的persistence.xml包含應用程序,而不是包含實體和bean的jar。此外,我有以下行添加到我的persistence.xml

<jar-file>Entities.jar</jar-file> 

但現在我必須把persistence.xml中在使用我的Entities.jar的任何應用程序。