0

サーベルトで、セッション Bean メソッドを呼び出して、JPA 経由でデータベースにデータを挿入しようとしています。挿入プロセスはセッション Bean に記述されます。

DBからデータを選択する別の例を試しました。「選択」はうまく機能します。しかし、挿入が機能しない理由がわかりません。

エラー情報は次のとおりです。

HTTP ステータス 500

説明: サーバーで内部エラー () が発生したため、この要求を実行できませんでした。

例外: javax.ejb.EJBException

注: 例外の完全なスタック トレースとその根本原因は、GlassFish Server Open Source Edition 3.0.1 ログで入手できます。

「tx.commit()」に何か問題があると思います。コメントするとエラーは発生しません。しかし、私は正確に何が問題なのかわかりません。

ビーンクラスはこちら

@Stateless
@LocalBean
public class testSession {

  public testSession() {
    // TODO Auto-generated constructor stub
  }

  public void insertData(){
    EntityManagerFactory emf;
    EntityManager em;

    //the Entity Class-Category
    Category cat=new Category();

    //set value
    cat.setId(5);
    cat.setName("test cat");

    //the "test" is the persist unit in persistence.xml 
    emf=Persistence.createEntityManagerFactory("test");
    em=emf.createEntityManager();

    EntityTransaction tx=em.getTransaction();
    tx.begin();
    em.persist(cat);
    tx.commit();
    em.close();
    emf.close();

  }
}

サーブレットで

@WebServlet("/testServlet")
public class testServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

@EJB
testSession ts;

public testServlet() {
   super();
}


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

    PrintWriter out=response.getWriter();
    out.print("<html><body>");
    //call the method in the session bean to insert data
    ts.insertData();
    out.print("</body></html>");
}


}
4

2 に答える 2

0

@PersistenceContext による注入が必要です。 EntityManager 自体は、persistence.xml の情報を使用してコンテナーによって作成されるため、実行時に使用するには、コンポーネントの 1 つに注入するように要求するだけです。@PersistenceContext を介してこれを行います

@PersistenceContext アノテーションは、任意の CDI Bean、EJB、サーブレット、サーブレット リスナー、サーブレット フィルター、または JSF ManagedBean で使用できます。EJB を使用しない場合は、UserTransaction を使用してトランザクションを手動で開始およびコミットする必要があります。EntityManager の作成、更新、または削除メソッドのいずれかが機能するには、トランザクションが必要です。

例:

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
@LocalBean
public class testSession {

@PersistenceContext(unitName = "MyUNIT_PERSIS_IMPORTANT_View_THE_persistence.XML")
    private EntityManager entityManager;

  public testSession() {
    // TODO Auto-generated constructor stub
  }

  public void insertData(){
    //the Entity Class-Category
    Category cat=new Category();

    //set value
    cat.setId(5);
    cat.setName("test cat");

    entityManager.persist(cat);

  }
}

Reference
http://tomee.apache.org/examples-trunk/injection-of-entitymanager/
于 2013-04-17T04:58:58.920 に答える
0

私はこのデモにMavenを使用しました

デモ

https://mega.co.nz/#!AxtRVQzB!MdwwOXA1e_VayWgwIdxGdREhd69QDb6la0yT0mLMaKA

サーブレット this の URL へ

http://<HOST>/use-session-bean-to-insert-data-with-jpa/testServlet

SQL 作成

CREATE TABLE category (
id INT NOT NULL AUTO_INCREMENT, 
`name` VARCHAR(200), 
PRIMARY KEY (id));

Persistence.xml

...
<persistence-unit name="test" transaction-type="JTA">
..

Java サーブレット

import com.mycompany.ejb.testSession;
import java.io.IOException;
import java.io.PrintWriter;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author I2B Boris
 */
@WebServlet(name = "testServlet", urlPatterns = {"/testServlet"})
public class testServlet extends HttpServlet {

    @EJB
    testSession ts;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        out.print("<html><body>");
        //call the method in the session bean to insert data
        ts.insertData();
        out.print("</body></html>");
    }
}

Java EJB

package com.mycompany.ejb;

import com.mycompany.entities.Category;
import javax.ejb.Stateless;
import javax.ejb.LocalBean;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 *
 * @author I2B Boris
 */
@Stateless
@LocalBean
public class testSession {

    @PersistenceContext(unitName = "test")
    private EntityManager entityManager;

    public void insertData() {
        //the Entity Class-Category
        Category cat = new Category();

        //set value
        cat.setId(5);
        cat.setName("test cat");

        entityManager.persist(cat);

    }
}

実在物

package com.mycompany.entities;

import java.io.Serializable;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author I2B Boris
 */
@Entity
@Table(name = "category")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Category.findAll", query = "SELECT c FROM Category c"),
    @NamedQuery(name = "Category.findById", query = "SELECT c FROM Category c WHERE c.id = :id"),
    @NamedQuery(name = "Category.findByName", query = "SELECT c FROM Category c WHERE c.name = :name")})
public class Category implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @NotNull
    @Column(name = "id")
    private Integer id;
    @Size(max = 200)
    @Column(name = "name")
    private String name;

    public Category() {
    }

    public Category(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Category)) {
            return false;
        }
        Category other = (Category) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "com.mycompany.entities.Category[ id=" + id + " ]";
    }

}
于 2013-04-17T13:43:57.243 に答える