Configure the entitymanager via a persistence. xml file
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0"> <persistence-unit name="movie-unit"> <jta-data-source>movieDatabase</jta-data-source> <non-jta-data-source>movieDatabaseUnmanaged</non-jta-data-source> <class>org.superbiz.injection.jpa.Movie</class> <properties> <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/> </properties> </persistence-unit></persistence>
Notice thatMovie
Entity is listed via<class>
Element. This is not required,
But can help when testing or whenMovie
Class is located in a different jar than the jar containingpersistence.xml
File.
If persistence. xml and entity are in the same jar package, class elements are not required.
Injection via @ persistencecontext
TheEntityManager
Itself is created by the container using the information inpersistence.xml
, So to use it at runtime, we simply need to request it be injected into one of our components. We do this@PersistenceContext
The@PersistenceContext
Annotation can be used on any CDI bean, EJB, Servlet, Servlet listener, Servlet filter, or JSF managedbean. If you don't use an EJB you will need to useUserTransaction
Begin and commit transactions manually. A transaction is required for any of the CREATE, update or delete methods of the entitymanager to work.
package org.superbiz.injection.jpa;import javax.ejb.Stateful;import javax.persistence.EntityManager;import javax.persistence.PersistenceContext;import javax.persistence.PersistenceContextType;import javax.persistence.Query;import java.util.List;@Statefulpublic class Movies { @PersistenceContext(unitName = "movie-unit", type = PersistenceContextType.EXTENDED) private EntityManager entityManager; public void addMovie(Movie movie) throws Exception { entityManager.persist(movie); } public void deleteMovie(Movie movie) throws Exception { entityManager.remove(movie); } public List<Movie> getMovies() throws Exception { Query query = entityManager.createQuery("SELECT m from Movie as m"); return query.getResultList(); }}
This participatesEntityManager
Is injected asEXTENDED
Persistence context, which simply means thatEntityManager
Is created when@Stateful
Bean is created and destroyed when@Stateful
Bean is destroyed. Simply put, the data inEntityManager
Is cached for the lifetime of@Stateful
Bean.
The useEXTENDED
Persistence contexts isOnlyAvailable@Stateful
Beans. See the JPA concepts page for an high level explanation of what a "persistence context" really is and how it is significant to JPA.
Entitymanager instantiation Method