аннотированный менеджер сущностей - PullRequest
2 голосов
/ 11 февраля 2012

Я делаю небольшой проект с использованием JPA. Мне нужно вставить объект сотрудника. Для этого, когда я использую аннотированный менеджер сущностей, я получил исключение NullPointer. Но когда я использую Normal EntityManager без аннотации, он работает нормально. Нужно ли настраивать где-то еще, кроме persistence.xml, чтобы этот пример нормально работал?

Пожалуйста, смотрите код ниже.

public class EmployeeDao implements IEmployeeDao{       

     @PersistenceContext(unitName = "timesheet")
    private EntityManager entityManager ;

    @Override
    public boolean createEmployee(IEmployee employee) { 

        this.entityManager.persist(employee);       

        return true;
    }
}

persistence.xml

<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
    <persistence-unit name="timesheet" transaction-type="RESOURCE_LOCAL">       
        <class>com.timesheet.model.Employee</class>     
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url"
                value="jdbc:mysql://localhost:3306/timesheet" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="" />

            <!-- EclipseLink should create the database schema automatically -->
            <property name="eclipselink.ddl-generation" value="create-tables" />
            <property name="eclipselink.ddl-generation.output-mode"
                value="database" />
        </properties>

    </persistence-unit>
</persistence>

Ответы [ 4 ]

3 голосов
/ 11 февраля 2012

Внедрение ресурсов (в вашем случае с использованием @ PersistenceContext ) работает только в управляемых контейнером классах (таких как EJB и сервлеты). Это объяснено более подробно, например, в спецификации Java EE v6, EE5.2.5.

Что вы можете сделать:

  • Измените свой класс так, чтобы он управлял классом
  • перенести внедрение ресурсов в управляемый класс и передать его EmployeeDao,
  • использовать поиск JNDI, как и раньше
1 голос
/ 11 февраля 2012

Используйте аннотацию javax.ejb.Stateless для классов EmployeeDao и IEmployeeDao.Entitymanager - это неинтерфейс, который Enterprise Java Bean внедряет в ваш клиент.

Клиент должен быть либо веб-компонентом, либо другим корпоративным компонентом.См. здесь для получения дополнительной информации об использовании EJB.

Другими словами, используя аннотацию Stateless, веб-контейнер будет заботиться о жизненном цикле вашего класса EmployeeDao.

0 голосов
/ 29 декабря 2016

Итак, прежде всего ответы приводят к обобщению, что:

  • Внедрение ресурсов с помощью аннотации будет работать для управляемых контейнером классов (например, EJB, Servlet).
  • Внедрение ресурсов может быть сделано за исключением аннотации (например, @PersistenceContext) для простого проекта JPA (проект, который не содержит контейнерных управляемых классов). Следующий фрагмент кода дает вам ясное представление:

      private EntityManagerFactory factory;
      factory = Persistence.createEntityManagerFactory("PERSISTENCE_UNIT_NAME");
      EntityManager em = factory.createEntityManager();
    

Спасибо всем за обмен знаниями.

0 голосов
/ 09 апреля 2015

Используйте тип транзакции JTA вместо RESOURCE_LOCAL. Вы можете получить экземпляр EntityManager, если и только если программа работает на сервере приложений и тип транзакции - JTA.

...