开发者

How do injection with JPA?

Is possible do injection in EntityManager with EclipseLink 2.3 ?

This is my persistence.xml file:

<?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.passwo开发者_开发问答rd" value="root"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
        </properties>
    </persistence-unit>
</persistence>

I'm new with JPA so I created this persistence.xml file at first just to test to see if it works, but now I would like to use @PersistenceContext to don't have to worry about manage the EntityMangerFactory and EntityManager.

I'm using Eclipse Indigo Java EE Web Developers with GlassFish v3.

UPDATE: I follow @Andrei Bodnarescu approach and this tutorial too and everything is fine to get a connection with my database through GF3:

How do injection with JPA?

And i change my persistence.xml file:

<?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>

So i try to persist something in my database:

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

And it returns a java.lang.NullPointerException in em.persist(user);. What am I doing wrong ?


You have to change the transaction-type to JTA as follows -

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

And then you can use @PersistenceContext as follows if you want Glassfish to inject the EntityManager into your EJB -

@Stateless
@LocalBean
public class MyEjb {

    @PersistenceContext("SuaParte")
    private EntityManager suaParteEM; 

}

You can do in Servlet and ManagedBean too.

Also, on your Glassfish server you can create JDBC Connection Pool and JDBC Resource, give it a JNDI name and use it to declare your EntityManager in the persistence.xml as follows -

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

You can create the JDBC Resources on from the Glassfish Admin-Console.


BheshG's answer is very good, here's just some small addendums.

  • i think that in order to activate CDI and thus have dependency injection you need to create an empty beans.xml file that you must place in the WEB-INF folder of your project

  • To create a data source in GF3 and expose it via JNDI like BheshG sais, you must to basically this:

    1. resources->JDBC->JDBC Connection pools and make a connection pool

    2. Create a datasource that will use the pool.

(I wanted to post images with examples for conenction pool and datasource, but I can't since I don't have reputation points. In order to not seem spammy and trolly, I'm just gonna say: email me if you want more details or an example project, as I'm working on a tutorial on exactly that right now)

Now you can use that datasource in the persistence.xml file to attach it to a persistence unit:

    <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>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜