Glassfish JPA:注入EntityManager的问题

Mar*_*enz 1 java jpa glassfish entitymanager java-ee

我是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;
    }
}

Run Code Online (Sandbox Code Playgroud)

BookService接口:


package beans;
import javax.ejb.Local;

@Local
public interface BookService {
    Book createOrUpdate(Book book);
    void remove(Book book);
    Book find(Object id);
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

的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>
Run Code Online (Sandbox Code Playgroud)

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

谢谢

马塞尔

Pas*_*ent 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>
Run Code Online (Sandbox Code Playgroud)

但是您应该从Servlet或JSF Managed Bean调用EJB(并且您的EJB可以注入此类组件中).

如果您需要一些示例,请查看Java EE代码示例和应用程序.

更新:请参阅如何从POJO访问本地EJB组件?在EJB FAQ中有关JNDI的更多详细信息(特别是EJB 3.1规范定义的新的可移植全局JNDI名称).