Glassfish JPA:注入EntityManager的问题

时间:2010-03-01 21:17:35

标签: java jpa java-ee glassfish entitymanager

我是Java EE的新手。我试着运行一些第一个例子(JPA)。 我正在使用Glassfish v3。麻烦的是我没有得到App Server注入 EntityManager。听到是一个例子http://www.adam-bien.com/roller/abien/entry/ejb_3_persistence_jpa_for   我用JSP客户端扩展了它。

实体:


package beans;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Book {

    @Id
    @GeneratedValue
    private Long id;
    private String title;
    private String subtitle;

    public Book() {
    }

    public Book(String title) {
        this.title = title;
    }
}

BookService界面:


package beans;
import javax.ejb.Local;

@Local
public interface BookService {
    Book createOrUpdate(Book book);
    void remove(Book book);
    Book find(Object id);
}

BookServiceBean:


package beans;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
public class BookServiceBean implements BookService {

    @PersistenceContext
    private EntityManager em;

    public Book createOrUpdate(Book book) {
        return em.merge(book);
    }
    public void remove(Book book) {
        em.remove(em.merge(book));
    }
    public Book find(Object id) {
        return em.find(Book.class, id);
    }
}

的persistence.xml:

<persistence>
    <persistence-unit name="sample" transaction-type="JTA">
    <jta-data-source>jdbc/MarcelsDataSource</jta-data-source>
    <properties>
        <property name="eclipselink.ddl-generation" value="create-tables"/>
    </properties>
</persistence-unit>
</persistence>

的index.jsp:

<%@ page import="beans.BookServiceBean" %>
<%@ page import="beans.Book" %>
<html>
<body>
<%
    BookServiceBean bs = new BookServiceBean();
    Book b = new Book("Superman");
    bs.createOrUpdate(b);
%>
</body>
</html>

如果我运行该示例,我在createOrUpdate()方法中得到java.lang.NullPointerException,因此entityManager是 显然没有正确注射。我试着找几天补救措施了 一些帮助将受到高度赞赏。

由于

马塞尔

3 个答案:

答案 0 :(得分:10)

你得到一个NullPointerException,因为你用BookService实例化你的new() - 这基本上是错误的 - 并且没有任何东西被注入到EJB中。 EJB是由容器管理的组件,应该通过注入或查找来获取。

虽然JSP规范允许任何代码在scriplet中运行,但实际上并不鼓励从JSP调用EJB,并且JSP不支持注入。换句话说,您将不得不使用查找:

<%@ page import="beans.BookService" %>
<%@ page import="beans.Book" %>
<html>
<body>
<%
    BookService bs = (BookService) new InitialContext().lookup("java:module/BookServiceBean")
    Book b = new Book("Superman");
    bs.createOrUpdate(b);
%>
</body>
</html>

但是你应该从Servlet或JSF Managed Bean调用你的EJB(你的EJB可以注入这些组件中)。

如果您需要一些样品,请查看Java EE Code Samples & Apps

更新:有关JNDI的更多详细信息,请参阅EJB常见问题解答中的How do I access a Local EJB component from a POJO?。(特别是新的portable global JNDI names defined by the EJB 3.1 specification)。

答案 1 :(得分:1)

尝试:

@PersistenceContext(unitName = "sample")
private EntityManager em;

答案 2 :(得分:0)

当你真的需要让容器注入它时(通过@EJB),你直接实例化服务bean。但是,JSP不支持这种方式,因此您也必须切换到servlet。