0

アプリケーションでは、JPA + hibernate を使用しています。ただし、データベースにアクセスしようとすると、次のエラーが発生します。

 java.lang.NullPointerException: javax.faces.FacesException:
#{loginBean.authenticate}: java.lang.NullPointerException

次の行を実行すると例外が発生します。EntityManager em = emf.createEntityManager();

以下に完全なサーバーログが表示されます。

18:21:48,174 INFO  [org.hibernate.engine.transaction.internal.TransactionFactoryInitiator] (http--0.0.0.0-8080-1) HHH000268: Transaction strategy: org.hibernate.engine.transaction.internal.jta.CMTTransactionFactory

18:21:48,177 INFO  [org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory] (http--0.0.0.0-8080-1) HHH000397: Using ASTQueryTranslatorFactory

18:21:48,189 INFO  [org.hibernate.tool.hbm2ddl.SchemaUpdate] (http--0.0.0.0-8080-1) HHH000228: Running hbm2ddl schema update

18:21:48,191 INFO  [org.hibernate.tool.hbm2ddl.SchemaUpdate] (http--0.0.0.0-8080-1) HHH000102: Fetching database metadata

18:21:48,193 INFO  [org.hibernate.tool.hbm2ddl.SchemaUpdate] (http--0.0.0.0-8080-1) HHH000396: Updating schema

18:21:48,195 INFO  [org.hibernate.tool.hbm2ddl.SchemaUpdate] (http--0.0.0.0-8080-1) HHH000232: Schema update complete

18:22:08,153 WARNING [javax.enterprise.resource.webcontainer.jsf.lifecycle] (http--0.0.0.0-8080-1) #{loginBean.authenticate}: java.lang.NullPointerException: javax.faces.FacesException: #{loginBean.authenticate}: java.lang.NullPointerException

    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118) [jsf-impl-2.1.7-jbossorg-2.jar:]

    at javax.faces.component.UICommand.broadcast(UICommand.java:315) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]

    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]

    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]

    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) [jsf-impl-2.1.7-jbossorg-2.jar:]

    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.1.7-jbossorg-2.jar:]

    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) [jsf-impl-2.1.7-jbossorg-2.jar:]

    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]

    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:]

    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]

    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:]

    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:]

    at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.1.1.Final.jar:7.1.1.Final]

    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]

    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:]

    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:]

    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:]

    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:]

    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:]

    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:]

    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:]

    at java.lang.Thread.run(Unknown Source) [rt.jar:1.6.0_32]

Caused by: javax.faces.el.EvaluationException: java.lang.NullPointerException

    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]

    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) [jsf-impl-2.1.7-jbossorg-2.jar:]

    ... 21 more

Caused by: java.lang.NullPointerException

    at org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.getStatus(JtaStatusHelper.java:73) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]

    at org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.isActive(JtaStatusHelper.java:115) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]

    at org.hibernate.engine.transaction.internal.jta.CMTTransaction.join(CMTTransaction.java:149) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]

    at org.hibernate.ejb.AbstractEntityManagerImpl.joinTransaction(AbstractEntityManagerImpl.java:1207) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]

    at org.hibernate.ejb.AbstractEntityManagerImpl.postInit(AbstractEntityManagerImpl.java:176) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]

    at org.hibernate.ejb.EntityManagerImpl.<init>(EntityManagerImpl.java:89) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]

    at org.hibernate.ejb.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:125) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]

    at org.hibernate.ejb.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:120) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]

    at org.Handlers.UserHandler.getAllUsers(UserHandler.java:32) [classes:]

    at org.tutorial.LoginBean.authenticate(LoginBean.java:50) [classes:]

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.6.0_32]

    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) [rt.jar:1.6.0_32]

    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) [rt.jar:1.6.0_32]

    at java.lang.reflect.Method.invoke(Unknown Source) [rt.jar:1.6.0_32]

    at org.apache.el.parser.AstValue.invoke(AstValue.java:262) [jbossweb-7.0.13.Final.jar:]

    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278) [jbossweb-7.0.13.Final.jar:]

    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) [jsf-impl-2.1.7-jbossorg-2.jar:]

    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]

    ... 22 more

私の推測では、何らかの理由で、エンティティ マネージャーと関係があると思います。hibernate と JPA を使用するのは本当に初めてです。データベースへのアクセス方法を示すクラスも添付します。誰かが私が間違っていることを理解できますか?

public class ProjectHandler {

    public void create(Project project) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("ResearchManagement.Data");

        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        em.persist(project);
        em.getTransaction().commit();
        em.close();
    }

    public List<Project> getAllProjects() {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("ResearchManagement.Data");

        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();

        Query query = em.createQuery("SELECT p FROM Project p");
        List<Project> projects = query.getResultList();
        em.getTransaction().commit();
        em.close();
        return projects;
    }

    public int deleteByProjectName(String projectName) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("ResearchManagement.Data");

        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();

        Query q = em.createQuery("DELETE FROM Project p WHERE p.projectName = :u");
        q.setParameter("u", projectName );    
        int deleted = q.executeUpdate();
        em.getTransaction().commit();
        em.close();
        return deleted;
    }

}

あなたの答えと私のコードに関するヒントをありがとう。ただし、アプリをデバッグすると、emf が null ではないことがわかります。次の行でまだエラーが発生します: EntityManager em = emf.createEntityManager();

したがって、emf は null の entityManager を返すと思います。理由はまだわかりません

アプリケーションを実行すると、サーバーログが奇妙に見えることに気づきました。pesistence ユニットを読み取り、すべてのテーブルを読み取るデータベースに接続します。

12:02:06,094 INFO [org.hibernate.validator.util.Version] (MSC サービス スレッド 1-3) Hibernate Validator 4.2.0.Final

12:02:06,328 INFO [org.hibernate.tool.hbm2ddl.SchemaUpdate] (MSC サービス スレッド 1-3) HHH000228: hbm2ddl スキーマ更新を実行中

12:02:06,328 INFO [org.hibernate.tool.hbm2ddl.SchemaUpdate] (MSC サービス スレッド 1-3) HHH000102: データベース メタデータの取得

12:02:06,328 INFO [org.hibernate.tool.hbm2ddl.SchemaUpdate] (MSC サービス スレッド 1-3) HHH000396: スキーマを更新しています

12:02:06,343 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000261: テーブルが見つかりました: researchprojects.departments

12:02:06,343 INFO [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000037: 列: [phonenumber, departmentid, name, city]

12:02:06,343 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000108: 外部キー: []

12:02:06,343 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000126: インデックス: [プライマリ]

12:02:06,359 INFO [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000261: テーブルが見つかりました: researchprojects.employees

12:02:06,359 INFO [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000037: 列: [phonenumber、departmentid、employeeid、lastname、firstname]

12:02:06,359 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000108: 外部キー: [fk9d39ef85d77ba982]

12:02:06,359 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000126: インデックス: [fk9d39ef85d77ba982、プライマリ]

12:02:06,374 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000261: テーブルが見つかりました: researchprojects.partners

12:02:06,374 INFO [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000037: 列: [partnerid、name、contactmail、city]

12:02:06,374 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000108: 外部キー: []

12:02:06,374 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000126: インデックス: [プライマリ]

12:02:06,374 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000261: テーブルが見つかりました: researchprojects.projects

12:02:06,390 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000037: 列: [部門 ID、期間、説明、プロジェクト名、プロジェクト ID]

12:02:06,390 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000108: 外部キー: [fkc479187ad77ba982]

12:02:06,390 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000126: インデックス: [プライマリ、fkc479187ad77ba982]

12:02:06,390 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000261: テーブルが見つかりました: researchprojects.projects_has_employees

12:02:06,390 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000037: 列: [projects_projectid、employees_employeeid]

12:02:06,390 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000108: 外部キー: [fk294f111bcd3ec025、fk294f111b92772ef4]

12:02:06,390 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000126: インデックス: [fk294f111bcd3ec025、プライマリ、fk294f111b92772ef4]

12:02:06,406 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000261: テーブルが見つかりました: researchprojects.projects_has_partners

12:02:06,406 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000037: 列: [partners_partnerid、projects_projectid]

12:02:06,406 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000108: 外部キー: [fk8d741055cd3ec025, fk8d7410555290eb4]

12:02:06,406 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000126: インデックス: [fk8d741055cd3ec025、fk8d7410555290eb4、プライマリ]

12:02:06,421 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000261: テーブルが見つかりました: researchprojects.users

12:02:06,421 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000037: 列: [ユーザー名、ユーザー ID、パスワード]

12:02:06,421 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000108: 外部キー: []

12:02:06,421 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000126: インデックス: [プライマリ]

12:02:06,421 INFO [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000261: テーブルが見つかりました: researchprojects.hibernate_sequence

12:02:06,437 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000037: 列: [next_val]

12:02:06,437 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000108: 外部キー: []

12:02:06,437 情報 [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC サービス スレッド 1-3) HHH000126: インデックス: []

12:02:06,437 INFO [org.hibernate.tool.hbm2ddl.SchemaUpdate] (MSC サービス スレッド 1-3) HHH000232: スキーマの更新が完了しました

ただし、ユーザーテーブル (getallUsers() ) を読み込もうとすると、emf が作成され、ログに次のように表示されます。

12:03:53,346 INFO [org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory] ​​(http--0.0.0.0-8080-1) HHH000397: ASTQueryTranslatorFactory の使用

12:03:53,347 INFO [org.hibernate.tool.hbm2ddl.SchemaUpdate] (http--0.0.0.0-8080-1) HHH000228: hbm2ddl スキーマ更新を実行中

12:03:53,347 INFO [org.hibernate.tool.hbm2ddl.SchemaUpdate] (http--0.0.0.0-8080-1) HHH000102: データベースのメタデータを取得しています

12:03:53,347 INFO [org.hibernate.tool.hbm2ddl.SchemaUpdate] (http--0.0.0.0-8080-1) HHH000396: スキーマを更新しています

12:03:53,347 INFO [org.hibernate.tool.hbm2ddl.SchemaUpdate] (http--0.0.0.0-8080-1) HHH000232: スキーマの更新が完了しました

これは、テーブルを読み取ることができなくなったことを意味します。これはあなたにとって何か意味がありますか?

4

2 に答える 2

2

このエラーは、org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.getStatus(JtaStatusHelper.java:73) にある Hibernate 内部によって引き起こされます。これは、JTA 構成またはクラスに問題があることを意味している可能性があります。後でユーザー トランザクションを開始しようとしているため、resource_local ではなく JTA として誤ってマークした可能性があります。

私はコードに精通していないため、これは完全な答えではありませんが、正しい方向を示すのに役立つことを願っています.

于 2012-10-24T14:33:39.000 に答える
0

とあなたが言う行に基づいて、NullPointerExceptionそれは次のようにスローされます:

EntityManager em = emf.createEntityManager();

また、次の場所にあると想定しています。

org.tutorial.LoginBean.authenticate(LoginBean.java:50).

あなたemfはおそらくnullです。提供したコードに基づいて、EntityManager が必要になるたびに EntityManagerFactory を作成しています。あなたはそれをするべきではありません。基本的に、これはコストのかかる操作であり、アプリの起動時に一度実行してから、アプリ全体で再利用する必要があります。EntityManagerFactory を取得するためのベスト プラクティスを参照して、それを解決する方法を確認 できます。


ここにあなたがいますが、あなたが提供したコードについていくつかの提案をしたいと思います。本来あるべきことをすべて実行しているわけではありません。トランザクションを処理し、必要に応じてロールバックするために、少なくとも try-finally ブロックが必要です。たとえば、作成方法を考えてみましょう:

public void create(Project project) {
        EntityManagerFactory emf =Persistence.createEntityManagerFactory("ResearchManagement.Data");

        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        try {
            //start the transaction
            tx.begin();
            em.persist(project);
            //commit it the transaction
            tx.commit();
        } finally {
            //if the transaction is still active then
            //than something bad happened, so we need to
            //roll it back
            if (tx.isActive()) {
               tx.rollback();
            }
            //close out the entity manager instance, we are
            //done with it here
            em.close();
        }
    }

最後のものはそれほど大きくはありません。それはフォーマットに関するものであり、正直なところ、それをコピーして質問に貼り付けた方法が原因だった可能性があります。しかし、コードにホワイト ペースが多すぎると、物事を把握するのが難しくなります。本質的に物事を読みやすくするために空白を使用します。あまりにも多くて、お尻をスクロールするのは苦痛です。


編集:あなたはコメントしました:

あなたの答えと私のコードに関するヒントをありがとう。ただし、アプリをデバッグすると、emf が null ではないことがわかります。次の行でまだエラーが発生します: EntityManager em = emf.createEntityManager();

したがって、emf は null の entityManager を返すと思います。理由はまだわかりません

emf.createEntityManager()null が返された場合EntityManager、その特定の行を指すスタックトレースはありませんが、インスタンスem自体でメソッドが呼び出された行 (たとえばem.getTransaction()) を指します。したがって、emfnull であるか、null であってはならず、使用されてemf.createEntityManager()いるものが null です。2つの選択肢のみ。

于 2012-10-23T20:45:44.460 に答える