2017-01-09 7 views
0

私は、データを取り込もうとしているEquipmentテーブルを持っています。このテーブルには、1つの自動増分IDと製造者列があります。hibernateを使用してデータをテーブルに取り込む正しい方法

すべてのメーカーデータをmanufacturerListというリストに保存しました。

次に、リスト全体をループし、各エントリに対して、そのエントリを持つ新しいEquipmentオブジェクトを作成し、変数tempに格納します。同じループで、私は休止状態のセッションを使用して私のテーブルにtempを保存しようとします。しかし

、私はこれを実行すると、私はこのエラーを取得しています

java.lang.IllegalStateException:セッション/ EntityManagerのは、Hibernateを使用しながら、このループを実装する正しい方法は何ですか

を閉じています?

SessionFactory factory = new Configuration() 
      .configure("hibernate.cfg.xml") 
      .addAnnotatedClass(Equipment.class) 
      .buildSessionFactory(); 

    Session session = factory.getCurrentSession(); 

      try{ 
        List<String> manufacturerList = new List<String>(); 
        //populate the list here 
        //... 

        for (String manufacturer:manufacturerList) { 
         System.out.println(manufacturer); 
         Equipment temp = new Equipment(manufacturer); 
         session.beginTransaction(); 
         session.save(temp); 
         session.getTransaction().commit(); 
        } 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } finally { 
       factory.close(); 
      } 

ありがとうございます。

答えて

0

sessionの値の取得方法は表示されません。明らかにあなたが持っているsessionは閉じられているか、正しく開かれていませんが、コードのその部分は表示されません。また、のクローズを表示していますが、その変数は表示するスニペットには含まれていません。

通常、EntityManagerFactoryは長時間にわたって保存できますが、EntityManagerのインスタンスの寿命はかなり短くする必要があります。エンティティマネージャ(またはSession)を複数のセッションに再利用しないでください。それぞれの後にそれを殺し、あなたがそれを必要とするときに新しいものを始める。これにより、開いているか閉じているかを簡単に判断できるようになり、悪名高いセッションのオーバーフィルが防止されます。

Equipmentは、正しく宣言され管理されたエンティティタイプであると仮定する必要があります。これは、ここには表示されていないため、エラーメッセージとは関係がないようです。

ループを実装する正しい方法は、ループを持つクラスのどこかでEntityManagerを初期化してループに使用し、ループの後にある程度閉じますが、EntityManagerFactoryは独自のロジックにしておきますフロー。

また、HibernateまたはJPAソリューションで「テーブルを取り込む」ことはありません。 Hibernate/JPAはオブジェクトモデル用であり、テーブルモデルではありません。エンティティタイプをオブジェクトタイプとして記述します(人為的な "ID"キーフィールドなし!)。あなたのコードの代わりにJPAがマッピングを処理させてください。テーブルではなくオブジェクトを考えます。

バルク操作は、JPAよりもJDBCを使用するほうが良い場合がよくあります。 JPAは、データを管理するのではなく、エンティティをモデリングするためのものです。

+0

迅速な対応をありがとうございます。私は自分の投稿を編集してセッション取得を組み込んだ。しかし、もともと私のコードでEntityManagerを使用しなかったので、それを修正するために私の既存のコードに何ができますか? – 000000000000000000000

1

挿入し、ループの範囲からものを取り除く遊んで、私は途中で閉じられていない、そのセッションを確保するためにセッションを使用して正しい順序に休止状態のこの特定の実装を信じては以下の通りです:

 SessionFactory factory = new Configuration() 
       .configure("hibernate.cfg.xml") 
       .addAnnotatedClass(Equipment.class) 
       .buildSessionFactory(); 

     Session session = factory.getCurrentSession(); 

     try{ 
       List<String> manufacturerList = new List<String>(); 
       //populate the list here 
       //... 

       session.beginTransaction(); 
       for (String manufacturer:manufacturerList) { 
        System.out.println(manufacturer); 
        Equipment temp = new Equipment(manufacturer); 
        session.save(temp); 
       } 
       session.getTransaction().commit(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      factory.close(); 
     } 

トランザクション何かがセッションに保存される前に開始されるべきです。そして、すべてのセーブ後、トランザクションはコミットされるべきです。

これに変更すると、プログラムはエラーなく実行されます。

私が紛失したり最適化できるものがあれば教えてください。

関連する問題