2013-04-17 21 views
0

在servelt中,我嘗試調用會話bean方法通過JPA將數據插入數據庫。插入過程寫入會話bean中。使用會話bean在JPA中插入數據

我試過另一個例子,我從數據庫中選擇數據。 「選擇」運作良好。但我不知道爲什麼插入不起作用。

錯誤信息是:

HTTP狀態500

描述:服務器遇到阻止其完成此請求一個內部錯誤()。

異常:javax.ejb.EJBException異常

注:異常的完整堆棧跟蹤和其根源是在GlassFish Server開源版3.0.1日誌可用。

我認爲「tx.commit()」有問題,當我評論它時,則沒有錯誤。但我不知道究竟是什麼問題。

這裏是bean類

@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(); 

    } 
} 

在servlet

@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>"); 
} 


} 
+1

請編輯您的問題,併發布全stractrace爲了找到罪魁禍首和可能的方案。 –

回答

0

,你需要通過@PersistenceContext 實體管理本身是由在persistence.xml使用的信息的容器中創建注入,所以要在運行時使用它,我們只需要將它注入到我們的某個組件中即可。我們通過@PersistenceContext執行此操作

@PersistenceContext註釋可用於任何CDI Bean,EJB,Servlet,Servlet監聽器,Servlet過濾器或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/ 
+0

感謝您的回覆。我試過你的解決方案,它仍然不起作用,並顯示相同的錯誤信息我使用glassfish服務器 –

0

我已經使用Maven的這個演示

演示

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

到的URL的servlet這個

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)); 

持久性。XML

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

的Java Servlet

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 + " ]"; 
    } 

} 
+0

。我嘗試了你所展示的,但它仍然得到相同的錯誤信息 - 來自會話bean的EJB異常... –

相關問題