Glassfish JPA: проблемы с введением EntityManager - PullRequest
1 голос
/ 02 марта 2010

Я новичок в Java EE. Я попытался запустить несколько первых примеров (JPA). Я использую Glassfish v3. Проблема в том, что я не получаю инъекцию сервера приложений 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>

Если я запускаю пример, я получаю исключение java.lang.NullPointerException в методе createOrUpdate (), поэтому entityManager очевидно, не введен правильно. Я пытался найти лекарство в течение нескольких дней и некоторая помощь будет высоко ценится.

Спасибо

Марсель

Ответы [ 3 ]

10 голосов
/ 02 марта 2010

Вы получаете NullPointerException, потому что вы создаете экземпляр BookService с new() - что в принципе неверно - и ничего не вводится в EJB. EJB - это компонент, который управляется контейнером и должен быть получен либо путем инъекции, либо с помощью поиска.

Здесь, в то время как спецификация JSP позволяет запускать любой код в скрипте, вызов EJB из JSP на самом деле не рекомендуется, и 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>

Но вы должны вызывать свой EJB из Servlet или JSF Managed Bean (и ваш EJB может быть введен в такие компоненты).

Если вам нужны примеры, ознакомьтесь с Образцами и приложениями кода Java EE .

Обновление: См. Как получить доступ к компоненту Local EJB из POJO? в FAQ по EJB для получения дополнительной информации о JNDI (особенно о новых переносимых глобальных именах JNDI ). определяется спецификацией EJB 3.1 ).

1 голос
/ 02 марта 2010

Попробуйте:

@PersistenceContext(unitName = "sample")
private EntityManager em;
0 голосов
/ 02 марта 2010

Вы создаете экземпляр сервисного компонента напрямую, когда вам действительно нужно, чтобы контейнер внедрил его (через @EJB). Однако это не поддерживается в JSP, поэтому вам также придется переключиться на сервлет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...