0

サーブレットで EntityManager を使用できませんか? このような :

@WebServlet(name = "ServletPrincipal", urlPatterns = { "/test" })
public class ServletPrincipal extends HttpServlet {


    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {


EntityManagerFactory emf = Persistence.createEntityManagerFactory("todo");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
for (int i = 0; i < 10; i++) {
Voiture car = new Voiture(0, "b", "c");
em.persist(car);
}

em.getTransaction().commit();

Query q1 = em.createQuery("SELECT COUNT(v) FROM Voiture v");
System.out.println("Le nombre d'enregistrement: "
+ q1.getSingleResult());

TypedQuery<Voiture> query = em.createQuery("SELECT v FROM Voiture v",
Voiture.class);
List<Voiture> results = query.getResultList();
for (Voiture p : results) {
System.out.println(p.getMatricule());

}
// Close the database connection:
em.close();
emf.close();

    }

}

できない場合、1 つのサーブレットで永続性を使用するにはどうすればよいでしょうか?

なぜ?

私は tomcate7、servlet3、jpa2、および Java EE 6 を使用しています。

4

3 に答える 3

0

@PersistenceContext と @PersistenceUnit を使用して、EntityManager と EntityManagerFactory への参照を渡すこともお勧めします。また、EMFactory はスレッドセーフであり、EM はそうではないことも考慮してください。

于 2014-02-01T01:26:34.743 に答える
0

通常、永続化コードをコントローラ サーブレットに保持することはお勧めできません。しかし、あなたの質問に答えるには、@Mikko Maunuが正しく言ったように、サーブレットでエンティティ マネージャーを使用できます。

于 2012-06-01T08:24:22.587 に答える
0

サーブレットで EntityManager を使用してもまったく問題ありません。

サーブレットは複数のリクエストを同時に処理できる (おそらくそうする) ため、また EntityManager はスレッド セーフではないため、サーブレットのフィールドに entityManager のインスタンスを割り当てる (また注入しない) べきではありません。

あなたができること、そしておそらくすべきことは、EntityManagerFactory のインスタンスを一度だけ作成して再利用することです。EntityManagerFactory は作成するのにコストのかかるオブジェクトであり、スレッドセーフであるため、同時リクエストに使用しても問題ありません。

この永続化ユニットが必要な場所にこのサーブレットしかない場合は、たとえば、サーブレットの init-method で EntityManagerFactory を開き、destroy-method で閉じることができます。

于 2012-05-31T16:24:45.877 に答える