Как сделать инъекцию с помощью JPA? - PullRequest
1 голос
/ 11 сентября 2011

Возможно ли сделать инъекцию в EntityManager с EclipseLink 2.3?

Это мой файл persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/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">
    <persistence-unit name="SuaParte" transaction-type="RESOURCE_LOCAL">
                // classes..
        <properties>
            <property name="eclipselink.jdbc.batch-writing" value="JDBC"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/schema"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="root"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
        </properties>
    </persistence-unit>
</persistence>

Я новичок в JPA, поэтому сначала я создал этот файл persistence.xml, чтобы проверить, работает ли он, но теперь я хотел бы использовать @PersistenceContext, чтобы не беспокоиться об управлении * 1007. * и EntityManager.

Я использую веб-разработчики Eclipse Indigo Java EE с GlassFish v3.

UPDATE: Я придерживаюсь подхода Андрея Боднареску и этого учебника , и все в порядке, чтобы установить соединение с моей базой данных через GF3:

Ping database

И я изменяю свой файл persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/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">
    <persistence-unit name="SuaParte" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>jdbc/mysql</jta-data-source>
                //classes.. 
    </persistence-unit>
</persistence>

Итак, я пытаюсь что-то сохранить в своей базе данных:

@Stateless
@LocalBean
public class DaoUser {
    @PersistenceContext(unitName="SuaParte")
    private EntityManager em;

    public void persist(User user){
        try{
            em.persist(user);
            }catch(Exception e){
            e.printStackTrace();
        }
    }
}

И он возвращает java.lang.NullPointerException в em.persist(user);. Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 11 сентября 2011

Ответ BheshG очень хороший, вот лишь несколько небольших дополнений.

  • Я думаю, что для активации CDI и, таким образом, для внедрения зависимости вам нужно создать пустой файл beans.xmlчто вы должны поместить в папку WEB-INF вашего проекта

  • Чтобы создать источник данных в GF3 и представить его через JNDI, как BheshG sais, вы должны в основном это:

    1. resources-> JDBC-> Пулы соединений JDBC и создание пула соединений

    2. Создание источника данных, который будет использовать пул.

(Я хотел опубликовать изображения с примерами для пула соединений и источника данных, но не могу, поскольку у меня нет репутационных очков. Чтобы не показаться спамом и тролли, яЯ просто скажу: напишите мне, если вы хотите больше деталей или пример проекта, так как я сейчас работаю над учебником по именно этому)

Теперь вы можете использовать этот источник данных в файле persistence.xmlчтобы прикрепить его к единице сохранения:

    <persistence-unit name="emJTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>jdbc/postgre_ds_jta</jta-data-source>
    <mapping-file>META-INF/emp-mappings.xml</mapping-file>
    <class>model.Employee</class>
    <class>model.ProjectManager</class>
    <class>model.Department</class>
    <class>model.Project</class>
    <class>model.Phone</class>
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
        <property name="hibernate.hbm2ddl.auto" value="update" />
    </properties>       
</persistence-unit>
1 голос
/ 11 сентября 2011

Вы должны изменить тип транзакции на JTA следующим образом -

<persistence-unit name="SuaParte" transaction-type="JTA">

И затем вы можете использовать @PersistenceContext следующим образом, если хотите от Glassfish до inject EntityManager вваш EJB -

@Stateless
@LocalBean
public class MyEjb {

    @PersistenceContext("SuaParte")
    private EntityManager suaParteEM; 

}

Вы можете сделать это также в Servlet и ManagedBean.

Кроме того, на вашем сервере Glassfish вы можете создать JDBC Connection Pool и JDBC Resource, дайте ему JNDI name и используйте его для объявления EntityManager в persistence.xml следующим образом -

<persistence-unit name="SuaParte" transaction-type="JTA">
    <jta-data-source>JNDI_Name_Of_JDBC_Resource</jta-data-source>

Вы можете создать JDBC Resources в Glassfish Admin-Console.

...