java - Glassfish JPA : Problems injecting EntityManager

标签 java jpa jakarta-ee glassfish entitymanager

我是 Java EE 的新手。我试图让一些第一个例子运行(JPA)。 我正在使用 Glassfish v3。问题是我没有让 App Server 注入(inject) 实体管理器。听说是一个例子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;
    }
}

图书服务接口(interface):


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

持久性.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>

索引.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 是 显然没有正确注入(inject)。几天来我一直在寻找补救方法 一些帮助将不胜感激。

谢谢

马塞尔

最佳答案

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

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

<%@ 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 可以注入(inject)到此类组件中)。

如果您需要一些示例,请查看 Java EE Code Samples & Apps .

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

关于java - Glassfish JPA : Problems injecting EntityManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2359139/

相关文章:

java - 将堆栈跟踪重定向到日志文件而不是控制台输出?

java - 为什么要使用@PostConstruct?

java - 修改 HazelcastHttpSession 实例的属性时是否需要锁定它?

java - 我有一个java问题,用于按名称一一移动文件

java - 为什么 getName 不包含在 java.lang.reflect.AccessibleObject 接口(interface)中?

java - 如何在集成测试中设置保存点(使用内存中的 hsqldb)?

hibernate - 使用持久引用保留对象时,使用JPA遇到数据库死锁

java - "No Persistence Unit Found"错误

java - Kotlin函数参数: how to define a function which can have a trailing lambda or interface as a parameter?

Java 作为 Java 的脚本语言?