1

Java EE は初めてで、名前付きクエリの使用に問題があります。JBoss 6 と Hibernate 3.6 (JPA 2.0) を使用します。エンティティは、persistence.xml ではなく、注釈を介して構成されます。

@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 { ... }

エンティティを含む jar をデプロイすると、名前付きクエリがバインドされていることが 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

named-query を使用するステートレス Bean は、Node-Entity と同じ jar にあります。ステートレス 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

2 に答える 2

4

確認事項:

  • 適切な持続性ユニットを表すことEntityManagerによって作成された場合EntityManagerFactory
  • Entity指定された永続ユニットによって実際に処理されるかどうか。指定された ID を持つエンティティをロードしてみてください。
  • 他のエンティティに対する他の名前付きクエリが見つかるかどうか

更新 1:エンティティが永続化ユニットによって読み込まれていないようです。を確認persistence.xml<exclude-unlisted-classes>て削除してください。Hibernate はエンティティの自動検出をサポートする必要がありますが、確認のためにクラスをリストしますpersistence.xml

更新 2:@Entity注釈が実際にjavax.persistence.Entityであることを確認してください。org.hibernate....

于 2011-06-09T15:28:47.490 に答える
1

この問題は、エンティティと Bean を含む の代わりに、アプリケーションを含む のpersistence.xml内部に移動することで解決できます。さらに、次の行を my に追加する必要がありました。warjarpersistence.xml

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

しかし今、私の .xml を使用するすべてのアプリケーションに persistence.xml を配置する必要がありますEntities.jar

于 2011-06-10T12:04:37.223 に答える