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:
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:
resources->JDBC->JDBC Connection pools and make a connection pool
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>
精彩评论