converting and fixing group of jpa examples
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/a68903e7 Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/a68903e7 Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/a68903e7 Branch: refs/heads/master Commit: a68903e7af00d9615d0d0b828cc95064bafabe72 Parents: 36b7a1e Author: ivanjunckes <[email protected]> Authored: Wed Jan 2 12:49:41 2019 -0200 Committer: ivanjunckes <[email protected]> Committed: Wed Jan 2 12:49:41 2019 -0200 ---------------------------------------------------------------------- examples/injection-of-entitymanager/README.adoc | 229 +++++++++++++++ examples/injection-of-entitymanager/README.md | 221 -------------- examples/jpa-eclipselink/README.adoc | 215 ++++++++++++++ examples/jpa-eclipselink/README.md | 211 -------------- examples/jpa-enumerated/README.adoc | 259 +++++++++++++++++ examples/jpa-enumerated/README.md | 252 ---------------- examples/jpa-hibernate/README.adoc | 213 ++++++++++++++ examples/jpa-hibernate/README.md | 209 -------------- examples/multi-jpa-provider-testing/README.adoc | 287 +++++++++++++++++++ examples/simple-remote-tomcatusers/README.adoc | 210 +++++++------- 10 files changed, 1308 insertions(+), 998 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/a68903e7/examples/injection-of-entitymanager/README.adoc ---------------------------------------------------------------------- diff --git a/examples/injection-of-entitymanager/README.adoc b/examples/injection-of-entitymanager/README.adoc new file mode 100644 index 0000000..821b1f5 --- /dev/null +++ b/examples/injection-of-entitymanager/README.adoc @@ -0,0 +1,229 @@ += Injection Of Entitymanager +:index-group: JPA +:jbake-type: page +:jbake-status: published + +This example shows use of `@PersistenceContext` to have an `EntityManager` with an +`EXTENDED` persistence context injected into a `@Stateful bean`. A JPA +`@Entity` bean is used with the `EntityManager` to create, persist and merge +data to a database. + +== Creating the JPA Entity + +The entity itself is simply a pojo annotated with `@Entity`. We create one called `Movie` which we can use to hold movie records. + +.... +package org.superbiz.injection.jpa; + +import javax.persistence.Entity; + +@Entity +public class Movie { + + @Id @GeneratedValue + private long id; + + private String director; + private String title; + private int year; + + public Movie() { + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public Movie(String director, String title, int year) { + this.director = director; + this.title = title; + this.year = year; + } + + public String getDirector() { + return director; + } + + public void setDirector(String director) { + this.director = director; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public int getYear() { + return year; + } + + public void setYear(int year) { + this.year = year; + } +} +.... + +== Configure the EntityManager via a persistence.xml file + +The above `Movie` entity can be created, removed, updated or deleted via an `EntityManager` object. The `EntityManager` itself is +configured via a `META-INF/persistence.xml` file that is placed in the same jar as the `Movie` entity. + +.... +<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 that the `Movie` entity is listed via a `<class>` element. This is not required, but can help when testing or when the +`Movie` class is located in a different jar than the jar containing the `persistence.xml` file. + +== Injection via @PersistenceContext + +The `EntityManager` itself is created by the container using the information in the `persistence.xml`, so to use it at +runtime, we simply need to request it be injected into one of our components. We do this via `@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 use a `UserTransaction` 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; + +@Stateful +public 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 particular `EntityManager` is injected as an `EXTENDED` persistence context, which simply means that the `EntityManager` +is created when the `@Stateful` bean is created and destroyed when the `@Stateful` bean is destroyed. Simply put, the +data in the `EntityManager` is cached for the lifetime of the `@Stateful` bean. + +The use of `EXTENDED` persistence contexts is *only* available to `@Stateful` beans. See the link:../../jpa-concepts.html[JPA Concepts] page for an high level explanation of what a "persistence context" really is and how it is significant to JPA. + +== MoviesTest + +Testing JPA is quite easy, we can simply use the `EJBContainer` API to create a container in our test case. + +.... +package org.superbiz.injection.jpa; + +import junit.framework.TestCase; + +import javax.ejb.embeddable.EJBContainer; +import javax.naming.Context; +import java.util.List; +import java.util.Properties; + +//START SNIPPET: code +public class MoviesTest extends TestCase { + + public void test() throws Exception { + + final Properties p = new Properties(); + p.put("movieDatabase", "new://Resource?type=DataSource"); + p.put("movieDatabase.JdbcDriver", "org.hsqldb.jdbcDriver"); + p.put("movieDatabase.JdbcUrl", "jdbc:hsqldb:mem:moviedb"); + + final Context context = EJBContainer.createEJBContainer(p).getContext(); + + Movies movies = (Movies) context.lookup("java:global/injection-of-entitymanager/Movies"); + + movies.addMovie(new Movie("Quentin Tarantino", "Reservoir Dogs", 1992)); + movies.addMovie(new Movie("Joel Coen", "Fargo", 1996)); + movies.addMovie(new Movie("Joel Coen", "The Big Lebowski", 1998)); + + List<Movie> list = movies.getMovies(); + assertEquals("List.size()", 3, list.size()); + + for (Movie movie : list) { + movies.deleteMovie(movie); + } + + assertEquals("Movies.getMovies()", 0, movies.getMovies().size()); + } +} +.... + += Running + +When we run our test case we should see output similar to the following. + +.... +------------------------------------------------------- + T E S T S +------------------------------------------------------- +Running org.superbiz.injection.jpa.MoviesTest +Apache OpenEJB 4.0.0-beta-1 build: 20111002-04:06 +http://tomee.apache.org/ +INFO - openejb.home = /Users/dblevins/examples/injection-of-entitymanager +INFO - openejb.base = /Users/dblevins/examples/injection-of-entitymanager +INFO - Using 'javax.ejb.embeddable.EJBContainer=true' +INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service) +INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager) +INFO - Configuring Service(id=movieDatabase, type=Resource, provider-id=Default JDBC Database) +INFO - Found EjbModule in classpath: /Users/dblevins/examples/injection-of-entitymanager/target/classes +INFO - Beginning load: /Users/dblevins/examples/injection-of-entitymanager/target/classes +INFO - Configuring enterprise application: /Users/dblevins/examples/injection-of-entitymanager +INFO - Configuring Service(id=Default Stateful Container, type=Container, provider-id=Default Stateful Container) +INFO - Auto-creating a container for bean Movies: Container(type=STATEFUL, id=Default Stateful Container) +INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container) +INFO - Auto-creating a container for bean org.superbiz.injection.jpa.MoviesTest: Container(type=MANAGED, id=Default Managed Container) +INFO - Configuring PersistenceUnit(name=movie-unit) +INFO - Auto-creating a Resource with id 'movieDatabaseNonJta' of type 'DataSource for 'movie-unit'. +INFO - Configuring Service(id=movieDatabaseNonJta, type=Resource, provider-id=movieDatabase) +INFO - Adjusting PersistenceUnit movie-unit <non-jta-data-source> to Resource ID 'movieDatabaseNonJta' from 'movieDatabaseUnmanaged' +INFO - Enterprise application "/Users/dblevins/examples/injection-of-entitymanager" loaded. +INFO - Assembling app: /Users/dblevins/examples/injection-of-entitymanager +INFO - PersistenceUnit(name=movie-unit, provider=org.apache.openjpa.persistence.PersistenceProviderImpl) - provider time 462ms +INFO - Jndi(name="java:global/injection-of-entitymanager/Movies!org.superbiz.injection.jpa.Movies") +INFO - Jndi(name="java:global/injection-of-entitymanager/Movies") +INFO - Jndi(name="java:global/EjbModule1461341140/org.superbiz.injection.jpa.MoviesTest!org.superbiz.injection.jpa.MoviesTest") +INFO - Jndi(name="java:global/EjbModule1461341140/org.superbiz.injection.jpa.MoviesTest") +INFO - Created Ejb(deployment-id=Movies, ejb-name=Movies, container=Default Stateful Container) +INFO - Created Ejb(deployment-id=org.superbiz.injection.jpa.MoviesTest, ejb-name=org.superbiz.injection.jpa.MoviesTest, container=Default Managed Container) +INFO - Started Ejb(deployment-id=Movies, ejb-name=Movies, container=Default Stateful Container) +INFO - Started Ejb(deployment-id=org.superbiz.injection.jpa.MoviesTest, ejb-name=org.superbiz.injection.jpa.MoviesTest, container=Default Managed Container) +INFO - Deployed Application(path=/Users/dblevins/examples/injection-of-entitymanager) +Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.301 sec + +Results : + +Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 +.... http://git-wip-us.apache.org/repos/asf/tomee/blob/a68903e7/examples/injection-of-entitymanager/README.md ---------------------------------------------------------------------- diff --git a/examples/injection-of-entitymanager/README.md b/examples/injection-of-entitymanager/README.md deleted file mode 100644 index 3200b5d..0000000 --- a/examples/injection-of-entitymanager/README.md +++ /dev/null @@ -1,221 +0,0 @@ -index-group=EntityManagers -type=page -status=published -title=Injection Of Entitymanager -~~~~~~ - -This example shows use of `@PersistenceContext` to have an `EntityManager` with an -`EXTENDED` persistence context injected into a `@Stateful bean`. A JPA -`@Entity` bean is used with the `EntityManager` to create, persist and merge -data to a database. - -## Creating the JPA Entity - -The entity itself is simply a pojo annotated with `@Entity`. We create one called `Movie` which we can use to hold movie records. - - package org.superbiz.injection.jpa; - - import javax.persistence.Entity; - - @Entity - public class Movie { - - @Id @GeneratedValue - private long id; - - private String director; - private String title; - private int year; - - public Movie() { - } - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public Movie(String director, String title, int year) { - this.director = director; - this.title = title; - this.year = year; - } - - public String getDirector() { - return director; - } - - public void setDirector(String director) { - this.director = director; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public int getYear() { - return year; - } - - public void setYear(int year) { - this.year = year; - } - } - -## Configure the EntityManager via a persistence.xml file - -The above `Movie` entity can be created, removed, updated or deleted via an `EntityManager` object. The `EntityManager` itself is -configured via a `META-INF/persistence.xml` file that is placed in the same jar as the `Movie` entity. - - <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 that the `Movie` entity is listed via a `<class>` element. This is not required, but can help when testing or when the -`Movie` class is located in a different jar than the jar containing the `persistence.xml` file. - -## Injection via @PersistenceContext - -The `EntityManager` itself is created by the container using the information in the `persistence.xml`, so to use it at -runtime, we simply need to request it be injected into one of our components. We do this via `@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 use a `UserTransaction` 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; - - @Stateful - public 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 particular `EntityManager` is injected as an `EXTENDED` persistence context, which simply means that the `EntityManager` -is created when the `@Stateful` bean is created and destroyed when the `@Stateful` bean is destroyed. Simply put, the -data in the `EntityManager` is cached for the lifetime of the `@Stateful` bean. - -The use of `EXTENDED` persistence contexts is **only** available to `@Stateful` beans. See the [JPA Concepts](../../jpa-concepts.html) page for an high level explanation of what a "persistence context" really is and how it is significant to JPA. - -## MoviesTest - -Testing JPA is quite easy, we can simply use the `EJBContainer` API to create a container in our test case. - - package org.superbiz.injection.jpa; - - import junit.framework.TestCase; - - import javax.ejb.embeddable.EJBContainer; - import javax.naming.Context; - import java.util.List; - import java.util.Properties; - - //START SNIPPET: code - public class MoviesTest extends TestCase { - - public void test() throws Exception { - - final Properties p = new Properties(); - p.put("movieDatabase", "new://Resource?type=DataSource"); - p.put("movieDatabase.JdbcDriver", "org.hsqldb.jdbcDriver"); - p.put("movieDatabase.JdbcUrl", "jdbc:hsqldb:mem:moviedb"); - - final Context context = EJBContainer.createEJBContainer(p).getContext(); - - Movies movies = (Movies) context.lookup("java:global/injection-of-entitymanager/Movies"); - - movies.addMovie(new Movie("Quentin Tarantino", "Reservoir Dogs", 1992)); - movies.addMovie(new Movie("Joel Coen", "Fargo", 1996)); - movies.addMovie(new Movie("Joel Coen", "The Big Lebowski", 1998)); - - List<Movie> list = movies.getMovies(); - assertEquals("List.size()", 3, list.size()); - - for (Movie movie : list) { - movies.deleteMovie(movie); - } - - assertEquals("Movies.getMovies()", 0, movies.getMovies().size()); - } - } - -# Running - -When we run our test case we should see output similar to the following. - - ------------------------------------------------------- - T E S T S - ------------------------------------------------------- - Running org.superbiz.injection.jpa.MoviesTest - Apache OpenEJB 4.0.0-beta-1 build: 20111002-04:06 - http://tomee.apache.org/ - INFO - openejb.home = /Users/dblevins/examples/injection-of-entitymanager - INFO - openejb.base = /Users/dblevins/examples/injection-of-entitymanager - INFO - Using 'javax.ejb.embeddable.EJBContainer=true' - INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service) - INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager) - INFO - Configuring Service(id=movieDatabase, type=Resource, provider-id=Default JDBC Database) - INFO - Found EjbModule in classpath: /Users/dblevins/examples/injection-of-entitymanager/target/classes - INFO - Beginning load: /Users/dblevins/examples/injection-of-entitymanager/target/classes - INFO - Configuring enterprise application: /Users/dblevins/examples/injection-of-entitymanager - INFO - Configuring Service(id=Default Stateful Container, type=Container, provider-id=Default Stateful Container) - INFO - Auto-creating a container for bean Movies: Container(type=STATEFUL, id=Default Stateful Container) - INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container) - INFO - Auto-creating a container for bean org.superbiz.injection.jpa.MoviesTest: Container(type=MANAGED, id=Default Managed Container) - INFO - Configuring PersistenceUnit(name=movie-unit) - INFO - Auto-creating a Resource with id 'movieDatabaseNonJta' of type 'DataSource for 'movie-unit'. - INFO - Configuring Service(id=movieDatabaseNonJta, type=Resource, provider-id=movieDatabase) - INFO - Adjusting PersistenceUnit movie-unit <non-jta-data-source> to Resource ID 'movieDatabaseNonJta' from 'movieDatabaseUnmanaged' - INFO - Enterprise application "/Users/dblevins/examples/injection-of-entitymanager" loaded. - INFO - Assembling app: /Users/dblevins/examples/injection-of-entitymanager - INFO - PersistenceUnit(name=movie-unit, provider=org.apache.openjpa.persistence.PersistenceProviderImpl) - provider time 462ms - INFO - Jndi(name="java:global/injection-of-entitymanager/Movies!org.superbiz.injection.jpa.Movies") - INFO - Jndi(name="java:global/injection-of-entitymanager/Movies") - INFO - Jndi(name="java:global/EjbModule1461341140/org.superbiz.injection.jpa.MoviesTest!org.superbiz.injection.jpa.MoviesTest") - INFO - Jndi(name="java:global/EjbModule1461341140/org.superbiz.injection.jpa.MoviesTest") - INFO - Created Ejb(deployment-id=Movies, ejb-name=Movies, container=Default Stateful Container) - INFO - Created Ejb(deployment-id=org.superbiz.injection.jpa.MoviesTest, ejb-name=org.superbiz.injection.jpa.MoviesTest, container=Default Managed Container) - INFO - Started Ejb(deployment-id=Movies, ejb-name=Movies, container=Default Stateful Container) - INFO - Started Ejb(deployment-id=org.superbiz.injection.jpa.MoviesTest, ejb-name=org.superbiz.injection.jpa.MoviesTest, container=Default Managed Container) - INFO - Deployed Application(path=/Users/dblevins/examples/injection-of-entitymanager) - Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.301 sec - - Results : - - Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 - http://git-wip-us.apache.org/repos/asf/tomee/blob/a68903e7/examples/jpa-eclipselink/README.adoc ---------------------------------------------------------------------- diff --git a/examples/jpa-eclipselink/README.adoc b/examples/jpa-eclipselink/README.adoc new file mode 100644 index 0000000..0c628fc --- /dev/null +++ b/examples/jpa-eclipselink/README.adoc @@ -0,0 +1,215 @@ += JPA Eclipselink +:index-group: JPA +:jbake-type: page +:jbake-status: published + +This example shows how to configure `persistence.xml` to work with Eclipselink. It uses an `@Entity` class and a `@Stateful` bean to add and delete entities from a database. + +== Creating the JPA Entity + +The entity itself is simply a pojo annotated with `@Entity`. We create one pojo called `Movie` which we can use to hold movie records. + +.... +package org.superbiz.eclipselink; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Movie { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + + private String director; + private String title; + private int year; + + public Movie() { + } + + public Movie(String director, String title, int year) { + this.director = director; + this.title = title; + this.year = year; + } + + public String getDirector() { + return director; + } + + public void setDirector(String director) { + this.director = director; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public int getYear() { + return year; + } + + public void setYear(int year) { + this.year = year; + } + +} +.... + +== Database Operations + +This is the bean responsible for database operations; it allows us to persist or delete entities. +For more information we recommend you to see http://tomee.apache.org/examples-trunk/injection-of-entitymanager/README.html[injection-of-entitymanager] + +.... +package org.superbiz.eclipselink; + +import javax.ejb.Stateful; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.PersistenceContextType; +import javax.persistence.Query; +import java.util.List; + +@Stateful +public 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(); + } +} +.... + +== Persistence.xml with EclipseLink configuration + +This operation is too easy, just set the `provider` to `org.eclipse.persistence.jpa.PersistenceProvider` and add additional properties to the persistence unit. +The example has followed a strategy that allows the creation of tables in a HSQL database. +For a complete list of persistence unit properties see http://www.eclipse.org/eclipselink/api/2.4/org/eclipse/persistence/config/PersistenceUnitProperties.html[here] + + <persistence version="1.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_1_0.xsd"> + <persistence-unit name="movie-unit"> + <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> + <jta-data-source>movieDatabase</jta-data-source> + <non-jta-data-source>movieDatabaseUnmanaged</non-jta-data-source> + <properties> + <property name="eclipselink.target-database" value="org.eclipse.persistence.platform.database.HSQLPlatform"/> + <property name="eclipselink.ddl-generation" value="create-tables"/> + <property name="eclipselink.ddl-generation.output-mode" value="database"/> + </properties> + </persistence-unit> + </persistence> + +== MoviesTest + +Testing JPA is quite easy, we can simply use the `EJBContainer` API to create a container in our test case. + +.... +package org.superbiz.eclipselink; + +import junit.framework.TestCase; + +import javax.ejb.embeddable.EJBContainer; +import javax.naming.Context; +import java.util.List; +import java.util.Properties; + +/** + * @version $Revision: 607077 $ $Date: 2007-12-27 06:55:23 -0800 (Thu, 27 Dec 2007) $ + */ +public class MoviesTest extends TestCase { + + public void test() throws Exception { + Properties p = new Properties(); + p.put("movieDatabase", "new://Resource?type=DataSource"); + p.put("movieDatabase.JdbcDriver", "org.hsqldb.jdbcDriver"); + p.put("movieDatabase.JdbcUrl", "jdbc:hsqldb:mem:moviedb"); + + final Context context = EJBContainer.createEJBContainer(p).getContext(); + + Movies movies = (Movies) context.lookup("java:global/jpa-eclipselink/Movies"); + + movies.addMovie(new Movie("Quentin Tarantino", "Reservoir Dogs", 1992)); + movies.addMovie(new Movie("Joel Coen", "Fargo", 1996)); + movies.addMovie(new Movie("Joel Coen", "The Big Lebowski", 1998)); + + List<Movie> list = movies.getMovies(); + assertEquals("List.size()", 3, list.size()); + + for (Movie movie : list) { + movies.deleteMovie(movie); + } + + assertEquals("Movies.getMovies()", 0, movies.getMovies().size()); + } +} +.... + += Running + +When we run our test case we should see output similar to the following. + +.... +------------------------------------------------------- + T E S T S +------------------------------------------------------- +Running org.superbiz.eclipselink.MoviesTest +Apache OpenEJB 4.0.0-beta-1 build: 20111002-04:06 +http://tomee.apache.org/ +INFO - openejb.home = /Users/dblevins/examples/jpa-eclipselink +INFO - openejb.base = /Users/dblevins/examples/jpa-eclipselink +INFO - Using 'javax.ejb.embeddable.EJBContainer=true' +INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service) +INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager) +INFO - Configuring Service(id=movieDatabase, type=Resource, provider-id=Default JDBC Database) +INFO - Found EjbModule in classpath: /Users/dblevins/examples/jpa-eclipselink/target/classes +INFO - Beginning load: /Users/dblevins/examples/jpa-eclipselink/target/classes +INFO - Configuring enterprise application: /Users/dblevins/examples/jpa-eclipselink +INFO - Configuring Service(id=Default Stateful Container, type=Container, provider-id=Default Stateful Container) +INFO - Auto-creating a container for bean Movies: Container(type=STATEFUL, id=Default Stateful Container) +INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container) +INFO - Auto-creating a container for bean org.superbiz.eclipselink.MoviesTest: Container(type=MANAGED, id=Default Managed Container) +INFO - Configuring PersistenceUnit(name=movie-unit, provider=org.eclipse.persistence.jpa.PersistenceProvider) +INFO - Auto-creating a Resource with id 'movieDatabaseNonJta' of type 'DataSource for 'movie-unit'. +INFO - Configuring Service(id=movieDatabaseNonJta, type=Resource, provider-id=movieDatabase) +INFO - Adjusting PersistenceUnit movie-unit <non-jta-data-source> to Resource ID 'movieDatabaseNonJta' from 'movieDatabaseUnmanaged' +INFO - Enterprise application "/Users/dblevins/examples/jpa-eclipselink" loaded. +INFO - Assembling app: /Users/dblevins/examples/jpa-eclipselink +INFO - PersistenceUnit(name=movie-unit, provider=org.eclipse.persistence.jpa.PersistenceProvider) - provider time 511ms +INFO - Jndi(name="java:global/jpa-eclipselink/Movies!org.superbiz.eclipselink.Movies") +INFO - Jndi(name="java:global/jpa-eclipselink/Movies") +INFO - Jndi(name="java:global/EjbModule225280863/org.superbiz.eclipselink.MoviesTest!org.superbiz.eclipselink.MoviesTest") +INFO - Jndi(name="java:global/EjbModule225280863/org.superbiz.eclipselink.MoviesTest") +INFO - Created Ejb(deployment-id=Movies, ejb-name=Movies, container=Default Stateful Container) +INFO - Created Ejb(deployment-id=org.superbiz.eclipselink.MoviesTest, ejb-name=org.superbiz.eclipselink.MoviesTest, container=Default Managed Container) +INFO - Started Ejb(deployment-id=Movies, ejb-name=Movies, container=Default Stateful Container) +INFO - Started Ejb(deployment-id=org.superbiz.eclipselink.MoviesTest, ejb-name=org.superbiz.eclipselink.MoviesTest, container=Default Managed Container) +INFO - Deployed Application(path=/Users/dblevins/examples/jpa-eclipselink) +Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.188 sec + +Results : + +Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 +.... http://git-wip-us.apache.org/repos/asf/tomee/blob/a68903e7/examples/jpa-eclipselink/README.md ---------------------------------------------------------------------- diff --git a/examples/jpa-eclipselink/README.md b/examples/jpa-eclipselink/README.md deleted file mode 100644 index 1023c9b..0000000 --- a/examples/jpa-eclipselink/README.md +++ /dev/null @@ -1,211 +0,0 @@ -index-group=EntityManagers -type=page -status=published -title=JPA Eclipselink -~~~~~~ - -This example shows how to configure `persistence.xml` to work with Eclipselink. It uses an `@Entity` class and a `@Stateful` bean to add and delete entities from a database. - -## Creating the JPA Entity - -The entity itself is simply a pojo annotated with `@Entity`. We create one pojo called `Movie` which we can use to hold movie records. - - package org.superbiz.eclipselink; - - import javax.persistence.Entity; - import javax.persistence.GeneratedValue; - import javax.persistence.GenerationType; - import javax.persistence.Id; - - @Entity - public class Movie { - - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private long id; - - private String director; - private String title; - private int year; - - public Movie() { - } - - public Movie(String director, String title, int year) { - this.director = director; - this.title = title; - this.year = year; - } - - public String getDirector() { - return director; - } - - public void setDirector(String director) { - this.director = director; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public int getYear() { - return year; - } - - public void setYear(int year) { - this.year = year; - } - - } - -## Database Operations - -This is the bean responsible for database operations; it allows us to persist or delete entities. -For more information we recommend you to see [injection-of-entitymanager](http://tomee.apache.org/examples-trunk/injection-of-entitymanager/README.html) - - - package org.superbiz.eclipselink; - - import javax.ejb.Stateful; - import javax.persistence.EntityManager; - import javax.persistence.PersistenceContext; - import javax.persistence.PersistenceContextType; - import javax.persistence.Query; - import java.util.List; - - @Stateful - public 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(); - } - } - -## Persistence.xml with EclipseLink configuration - -This operation is too easy, just set the `provider` to `org.eclipse.persistence.jpa.PersistenceProvider` and add additional properties to the persistence unit. -The example has followed a strategy that allows the creation of tables in a HSQL database. -For a complete list of persistence unit properties see [here](http://www.eclipse.org/eclipselink/api/2.4/org/eclipse/persistence/config/PersistenceUnitProperties.html) - - <persistence version="1.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_1_0.xsd"> - <persistence-unit name="movie-unit"> - <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> - <jta-data-source>movieDatabase</jta-data-source> - <non-jta-data-source>movieDatabaseUnmanaged</non-jta-data-source> - <properties> - <property name="eclipselink.target-database" value="org.eclipse.persistence.platform.database.HSQLPlatform"/> - <property name="eclipselink.ddl-generation" value="create-tables"/> - <property name="eclipselink.ddl-generation.output-mode" value="database"/> - </properties> - </persistence-unit> - </persistence> - - -## MoviesTest - -Testing JPA is quite easy, we can simply use the `EJBContainer` API to create a container in our test case. - - package org.superbiz.eclipselink; - - import junit.framework.TestCase; - - import javax.ejb.embeddable.EJBContainer; - import javax.naming.Context; - import java.util.List; - import java.util.Properties; - - /** - * @version $Revision: 607077 $ $Date: 2007-12-27 06:55:23 -0800 (Thu, 27 Dec 2007) $ - */ - public class MoviesTest extends TestCase { - - public void test() throws Exception { - Properties p = new Properties(); - p.put("movieDatabase", "new://Resource?type=DataSource"); - p.put("movieDatabase.JdbcDriver", "org.hsqldb.jdbcDriver"); - p.put("movieDatabase.JdbcUrl", "jdbc:hsqldb:mem:moviedb"); - - final Context context = EJBContainer.createEJBContainer(p).getContext(); - - Movies movies = (Movies) context.lookup("java:global/jpa-eclipselink/Movies"); - - movies.addMovie(new Movie("Quentin Tarantino", "Reservoir Dogs", 1992)); - movies.addMovie(new Movie("Joel Coen", "Fargo", 1996)); - movies.addMovie(new Movie("Joel Coen", "The Big Lebowski", 1998)); - - List<Movie> list = movies.getMovies(); - assertEquals("List.size()", 3, list.size()); - - for (Movie movie : list) { - movies.deleteMovie(movie); - } - - assertEquals("Movies.getMovies()", 0, movies.getMovies().size()); - } - } - -# Running - -When we run our test case we should see output similar to the following. - - ------------------------------------------------------- - T E S T S - ------------------------------------------------------- - Running org.superbiz.eclipselink.MoviesTest - Apache OpenEJB 4.0.0-beta-1 build: 20111002-04:06 - http://tomee.apache.org/ - INFO - openejb.home = /Users/dblevins/examples/jpa-eclipselink - INFO - openejb.base = /Users/dblevins/examples/jpa-eclipselink - INFO - Using 'javax.ejb.embeddable.EJBContainer=true' - INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service) - INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager) - INFO - Configuring Service(id=movieDatabase, type=Resource, provider-id=Default JDBC Database) - INFO - Found EjbModule in classpath: /Users/dblevins/examples/jpa-eclipselink/target/classes - INFO - Beginning load: /Users/dblevins/examples/jpa-eclipselink/target/classes - INFO - Configuring enterprise application: /Users/dblevins/examples/jpa-eclipselink - INFO - Configuring Service(id=Default Stateful Container, type=Container, provider-id=Default Stateful Container) - INFO - Auto-creating a container for bean Movies: Container(type=STATEFUL, id=Default Stateful Container) - INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container) - INFO - Auto-creating a container for bean org.superbiz.eclipselink.MoviesTest: Container(type=MANAGED, id=Default Managed Container) - INFO - Configuring PersistenceUnit(name=movie-unit, provider=org.eclipse.persistence.jpa.PersistenceProvider) - INFO - Auto-creating a Resource with id 'movieDatabaseNonJta' of type 'DataSource for 'movie-unit'. - INFO - Configuring Service(id=movieDatabaseNonJta, type=Resource, provider-id=movieDatabase) - INFO - Adjusting PersistenceUnit movie-unit <non-jta-data-source> to Resource ID 'movieDatabaseNonJta' from 'movieDatabaseUnmanaged' - INFO - Enterprise application "/Users/dblevins/examples/jpa-eclipselink" loaded. - INFO - Assembling app: /Users/dblevins/examples/jpa-eclipselink - INFO - PersistenceUnit(name=movie-unit, provider=org.eclipse.persistence.jpa.PersistenceProvider) - provider time 511ms - INFO - Jndi(name="java:global/jpa-eclipselink/Movies!org.superbiz.eclipselink.Movies") - INFO - Jndi(name="java:global/jpa-eclipselink/Movies") - INFO - Jndi(name="java:global/EjbModule225280863/org.superbiz.eclipselink.MoviesTest!org.superbiz.eclipselink.MoviesTest") - INFO - Jndi(name="java:global/EjbModule225280863/org.superbiz.eclipselink.MoviesTest") - INFO - Created Ejb(deployment-id=Movies, ejb-name=Movies, container=Default Stateful Container) - INFO - Created Ejb(deployment-id=org.superbiz.eclipselink.MoviesTest, ejb-name=org.superbiz.eclipselink.MoviesTest, container=Default Managed Container) - INFO - Started Ejb(deployment-id=Movies, ejb-name=Movies, container=Default Stateful Container) - INFO - Started Ejb(deployment-id=org.superbiz.eclipselink.MoviesTest, ejb-name=org.superbiz.eclipselink.MoviesTest, container=Default Managed Container) - INFO - Deployed Application(path=/Users/dblevins/examples/jpa-eclipselink) - Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.188 sec - - Results : - - Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 - http://git-wip-us.apache.org/repos/asf/tomee/blob/a68903e7/examples/jpa-enumerated/README.adoc ---------------------------------------------------------------------- diff --git a/examples/jpa-enumerated/README.adoc b/examples/jpa-enumerated/README.adoc new file mode 100644 index 0000000..c446204 --- /dev/null +++ b/examples/jpa-enumerated/README.adoc @@ -0,0 +1,259 @@ += JPA and Enums via @Enumerated +:index-group: JPA +:jbake-type: page +:jbake-status: published + +It can sometimes be desirable to have a Java `enum` type to represent a particular column in a database. JPA supports converting database data to and from Java `enum` types via the `@javax.persistence.Enumerated` annotation. + +This example will show basic `@Enumerated` usage in a field of an `@Entity` as well as ``enum``s as the parameter of a `Query`. We'll also see that the actual database representation can be effectively `String` or `int`. + +== Enum + +For our example we will leverage the familiar `Movie` entity and add a new field to represent the MPAA.org rating of the movie. This is defined via a simple `enum` that requires no JPA specific annotations. + + public enum Rating { + UNRATED, + G, + PG, + PG13, + R, + NC17 + } + +== @Enumerated + +In our `Movie` entity, we add a `rating` field of the enum type `Rating` and annotate it with `@Enumerated(EnumType.STRING)` to declare that its value should be converted from what is effectively a `String` in the database to the `Rating` type. + +.... +@Entity +public class Movie { + + @Id + @GeneratedValue + private int id; + private String director; + private String title; + private int year; + + @Enumerated(EnumType.STRING) + private Rating rating; + + public Movie() { + } + + public Movie(String director, String title, int year, Rating rating) { + this.director = director; + this.title = title; + this.year = year; + this.rating = rating; + } + + public String getDirector() { + return director; + } + + public void setDirector(String director) { + this.director = director; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public int getYear() { + return year; + } + + public void setYear(int year) { + this.year = year; + } + + public Rating getRating() { + return rating; + } + + public void setRating(Rating rating) { + this.rating = rating; + } +} +.... + +The above is enough and we are effectively done. For the sake of completeness we'll show a sample `Query` + +== Enum in JPQL Query + +Note the `findByRating` method which creates a `Query` with a `rating` named parameter. The key thing to notice is that the `rating` enum instance itself is passed into the + `query.setParameter` method, *not* `rating.name()` or `rating.ordinal()`. + +Regardless if you use `EnumType.STRING` or `EnumType.ORDINAL`, you still always pass the enum itself in calls to `query.setParameter`. + +.... +@Stateful +public class Movies { + + @PersistenceContext(unitName = "movie-unit", type = PersistenceContextType.EXTENDED) + private EntityManager entityManager; + + public void addMovie(Movie movie) { + entityManager.persist(movie); + } + + public void deleteMovie(Movie movie) { + entityManager.remove(movie); + } + + public List<Movie> findByRating(Rating rating) { + final Query query = entityManager.createQuery("SELECT m FROM Movie as m WHERE m.rating = :rating"); + query.setParameter("rating", rating); + return query.getResultList(); + } + + public List<Movie> getMovies() throws Exception { + Query query = entityManager.createQuery("SELECT m from Movie as m"); + return query.getResultList(); + } + +} +.... + +== EnumType.STRING vs EnumType.ORDINAL + +It is a matter of style how you would like your `enum` data represented in the database. Either `name()` or `ordinal()` are supported: + +* `@Enumerated(EnumType.STRING) Rating rating` the value of `rating.name()` is written and read from the corresponding database column; e.g. `G`, `PG`, `PG13` +* `@Enumerated(EnumType.ORDINAL) Rating rating` the value of `rating.ordinal()` is written and read from the corresponding database column; e.g. `0`, `1`, `2` + +The default is `EnumType.ORDINAL` + +There are advantages and disadvantages to each. + +=== Disadvantage of EnumType.ORDINAL + +A disadvantage of `EnumType.ORDINAL` is the effect of time and the desire to keep `enums` in a logical order. With `EnumType.ORDINAL` any new enum elements must be added to the +*end* of the list or you will accidentally change the meaning of all your records. + +Let's use our `Rating` enum and see how it would have had to evolve over time to keep up with changes in the MPAA.org ratings system. + +*1980* + + public enum Rating { + G, + PG, + R, + UNRATED + } + +*1984* PG-13 is added + + public enum Rating { + G, + PG, + R, + UNRATED, + PG13 + } + +*1990* NC-17 is added + + public enum Rating { + G, + PG, + R, + UNRATED, + PG13, + NC17 + } + +If `EnumType.STRING` was used, then the enum could be reordered at anytime and would instead look as we have defined it originally with ratings starting at `G` and increasing in severity to `NC17` and eventually `UNRATED`. With `EnumType.ORDINAL` the logical ordering would not have withstood the test of time as new values were added. + +If the order of the enum values is significant to your code, avoid `EnumType.ORDINAL` + +== Unit Testing the JPA @Enumerated + +.... +public class MoviesTest extends TestCase { + + public void test() throws Exception { + + final Properties p = new Properties(); + p.put("movieDatabase", "new://Resource?type=DataSource"); + p.put("movieDatabase.JdbcDriver", "org.hsqldb.jdbcDriver"); + p.put("movieDatabase.JdbcUrl", "jdbc:hsqldb:mem:moviedb"); + + EJBContainer container = EJBContainer.createEJBContainer(p); + final Context context = container.getContext(); + + final Movies movies = (Movies) context.lookup("java:global/jpa-scratch/Movies"); + + movies.addMovie(new Movie("James Frawley", "The Muppet Movie", 1979, Rating.G)); + movies.addMovie(new Movie("Jim Henson", "The Great Muppet Caper", 1981, Rating.G)); + movies.addMovie(new Movie("Frank Oz", "The Muppets Take Manhattan", 1984, Rating.G)); + movies.addMovie(new Movie("James Bobin", "The Muppets", 2011, Rating.PG)); + + assertEquals("List.size()", 4, movies.getMovies().size()); + + assertEquals("List.size()", 3, movies.findByRating(Rating.G).size()); + + assertEquals("List.size()", 1, movies.findByRating(Rating.PG).size()); + + assertEquals("List.size()", 0, movies.findByRating(Rating.R).size()); + + container.close(); + } +} +.... + += Running + +To run the example via maven: + + cd jpa-enumerated + mvn clean install + +Which will generate output similar to the following: + +.... +------------------------------------------------------- + T E S T S +------------------------------------------------------- +Running org.superbiz.jpa.enums.MoviesTest +Apache OpenEJB 4.0.0-beta-2 build: 20120115-08:26 +http://tomee.apache.org/ +INFO - openejb.home = /Users/dblevins/openejb/examples/jpa-enumerated +INFO - openejb.base = /Users/dblevins/openejb/examples/jpa-enumerated +INFO - Using 'javax.ejb.embeddable.EJBContainer=true' +INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service) +INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager) +INFO - Configuring Service(id=movieDatabase, type=Resource, provider-id=Default JDBC Database) +INFO - Found EjbModule in classpath: /Users/dblevins/openejb/examples/jpa-enumerated/target/classes +INFO - Beginning load: /Users/dblevins/openejb/examples/jpa-enumerated/target/classes +INFO - Configuring enterprise application: /Users/dblevins/openejb/examples/jpa-enumerated +INFO - Configuring Service(id=Default Stateful Container, type=Container, provider-id=Default Stateful Container) +INFO - Auto-creating a container for bean Movies: Container(type=STATEFUL, id=Default Stateful Container) +INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container) +INFO - Auto-creating a container for bean org.superbiz.jpa.enums.MoviesTest: Container(type=MANAGED, id=Default Managed Container) +INFO - Configuring PersistenceUnit(name=movie-unit) +INFO - Auto-creating a Resource with id 'movieDatabaseNonJta' of type 'DataSource for 'movie-unit'. +INFO - Configuring Service(id=movieDatabaseNonJta, type=Resource, provider-id=movieDatabase) +INFO - Adjusting PersistenceUnit movie-unit <non-jta-data-source> to Resource ID 'movieDatabaseNonJta' from 'movieDatabaseUnmanaged' +INFO - Enterprise application "/Users/dblevins/openejb/examples/jpa-enumerated" loaded. +INFO - Assembling app: /Users/dblevins/openejb/examples/jpa-enumerated +INFO - PersistenceUnit(name=movie-unit, provider=org.apache.openjpa.persistence.PersistenceProviderImpl) - provider time 406ms +INFO - Jndi(name="java:global/jpa-enumerated/Movies!org.superbiz.jpa.enums.Movies") +INFO - Jndi(name="java:global/jpa-enumerated/Movies") +INFO - Created Ejb(deployment-id=Movies, ejb-name=Movies, container=Default Stateful Container) +INFO - Started Ejb(deployment-id=Movies, ejb-name=Movies, container=Default Stateful Container) +INFO - Deployed Application(path=/Users/dblevins/openejb/examples/jpa-enumerated) +INFO - Undeploying app: /Users/dblevins/openejb/examples/jpa-enumerated +INFO - Closing DataSource: movieDatabase +INFO - Closing DataSource: movieDatabaseNonJta +Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.831 sec + +Results : + +Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 +.... http://git-wip-us.apache.org/repos/asf/tomee/blob/a68903e7/examples/jpa-enumerated/README.md ---------------------------------------------------------------------- diff --git a/examples/jpa-enumerated/README.md b/examples/jpa-enumerated/README.md deleted file mode 100644 index d85b3b0..0000000 --- a/examples/jpa-enumerated/README.md +++ /dev/null @@ -1,252 +0,0 @@ -index-group=EntityManagers -type=page -status=published -title=JPA and Enums via @Enumerated -~~~~~~ - -It can sometimes be desirable to have a Java `enum` type to represent a particular column in a database. JPA supports converting database data to and from Java `enum` types via the `@javax.persistence.Enumerated` annotation. - -This example will show basic `@Enumerated` usage in a field of an `@Entity` as well as `enum`s as the parameter of a `Query`. We'll also see that the actual database representation can be effectively `String` or `int`. - -## Enum - -For our example we will leverage the familiar `Movie` entity and add a new field to represent the MPAA.org rating of the movie. This is defined via a simple `enum` that requires no JPA specific annotations. - - public enum Rating { - UNRATED, - G, - PG, - PG13, - R, - NC17 - } - -## @Enumerated - -In our `Movie` entity, we add a `rating` field of the enum type `Rating` and annotate it with `@Enumerated(EnumType.STRING)` to declare that its value should be converted from what is effectively a `String` in the database to the `Rating` type. - - @Entity - public class Movie { - - @Id - @GeneratedValue - private int id; - private String director; - private String title; - private int year; - - @Enumerated(EnumType.STRING) - private Rating rating; - - public Movie() { - } - - public Movie(String director, String title, int year, Rating rating) { - this.director = director; - this.title = title; - this.year = year; - this.rating = rating; - } - - public String getDirector() { - return director; - } - - public void setDirector(String director) { - this.director = director; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public int getYear() { - return year; - } - - public void setYear(int year) { - this.year = year; - } - - public Rating getRating() { - return rating; - } - - public void setRating(Rating rating) { - this.rating = rating; - } - } - -The above is enough and we are effectively done. For the sake of completeness we'll show a sample `Query` - -## Enum in JPQL Query - -Note the `findByRating` method which creates a `Query` with a `rating` named parameter. The key thing to notice is that the `rating` enum instance itself is passed into the - `query.setParameter` method, **not** `rating.name()` or `rating.ordinal()`. - -Regardless if you use `EnumType.STRING` or `EnumType.ORDINAL`, you still always pass the enum itself in calls to `query.setParameter`. - - @Stateful - public class Movies { - - @PersistenceContext(unitName = "movie-unit", type = PersistenceContextType.EXTENDED) - private EntityManager entityManager; - - public void addMovie(Movie movie) { - entityManager.persist(movie); - } - - public void deleteMovie(Movie movie) { - entityManager.remove(movie); - } - - public List<Movie> findByRating(Rating rating) { - final Query query = entityManager.createQuery("SELECT m FROM Movie as m WHERE m.rating = :rating"); - query.setParameter("rating", rating); - return query.getResultList(); - } - - public List<Movie> getMovies() throws Exception { - Query query = entityManager.createQuery("SELECT m from Movie as m"); - return query.getResultList(); - } - - } - -## EnumType.STRING vs EnumType.ORDINAL - -It is a matter of style how you would like your `enum` data represented in the database. Either `name()` or `ordinal()` are supported: - - - `@Enumerated(EnumType.STRING) Rating rating` the value of `rating.name()` is written and read from the corresponding database column; e.g. `G`, `PG`, `PG13` - - `@Enumerated(EnumType.ORDINAL) Rating rating` the value of `rating.ordinal()` is written and read from the corresponding database column; e.g. `0`, `1`, `2` - -The default is `EnumType.ORDINAL` - -There are advantages and disadvantages to each. - -### Disadvantage of EnumType.ORDINAL - -A disadvantage of `EnumType.ORDINAL` is the effect of time and the desire to keep `enums` in a logical order. With `EnumType.ORDINAL` any new enum elements must be added to the -**end** of the list or you will accidentally change the meaning of all your records. - -Let's use our `Rating` enum and see how it would have had to evolve over time to keep up with changes in the MPAA.org ratings system. - -**1980** - - public enum Rating { - G, - PG, - R, - UNRATED - } - -**1984** PG-13 is added - - public enum Rating { - G, - PG, - R, - UNRATED, - PG13 - } - -**1990** NC-17 is added - - public enum Rating { - G, - PG, - R, - UNRATED, - PG13, - NC17 - } - -If `EnumType.STRING` was used, then the enum could be reordered at anytime and would instead look as we have defined it originally with ratings starting at `G` and increasing in severity to `NC17` and eventually `UNRATED`. With `EnumType.ORDINAL` the logical ordering would not have withstood the test of time as new values were added. - -If the order of the enum values is significant to your code, avoid `EnumType.ORDINAL` - -## Unit Testing the JPA @Enumerated - - public class MoviesTest extends TestCase { - - public void test() throws Exception { - - final Properties p = new Properties(); - p.put("movieDatabase", "new://Resource?type=DataSource"); - p.put("movieDatabase.JdbcDriver", "org.hsqldb.jdbcDriver"); - p.put("movieDatabase.JdbcUrl", "jdbc:hsqldb:mem:moviedb"); - - EJBContainer container = EJBContainer.createEJBContainer(p); - final Context context = container.getContext(); - - final Movies movies = (Movies) context.lookup("java:global/jpa-scratch/Movies"); - - movies.addMovie(new Movie("James Frawley", "The Muppet Movie", 1979, Rating.G)); - movies.addMovie(new Movie("Jim Henson", "The Great Muppet Caper", 1981, Rating.G)); - movies.addMovie(new Movie("Frank Oz", "The Muppets Take Manhattan", 1984, Rating.G)); - movies.addMovie(new Movie("James Bobin", "The Muppets", 2011, Rating.PG)); - - assertEquals("List.size()", 4, movies.getMovies().size()); - - assertEquals("List.size()", 3, movies.findByRating(Rating.G).size()); - - assertEquals("List.size()", 1, movies.findByRating(Rating.PG).size()); - - assertEquals("List.size()", 0, movies.findByRating(Rating.R).size()); - - container.close(); - } - } - -# Running - -To run the example via maven: - - cd jpa-enumerated - mvn clean install - -Which will generate output similar to the following: - - ------------------------------------------------------- - T E S T S - ------------------------------------------------------- - Running org.superbiz.jpa.enums.MoviesTest - Apache OpenEJB 4.0.0-beta-2 build: 20120115-08:26 - http://tomee.apache.org/ - INFO - openejb.home = /Users/dblevins/openejb/examples/jpa-enumerated - INFO - openejb.base = /Users/dblevins/openejb/examples/jpa-enumerated - INFO - Using 'javax.ejb.embeddable.EJBContainer=true' - INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service) - INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager) - INFO - Configuring Service(id=movieDatabase, type=Resource, provider-id=Default JDBC Database) - INFO - Found EjbModule in classpath: /Users/dblevins/openejb/examples/jpa-enumerated/target/classes - INFO - Beginning load: /Users/dblevins/openejb/examples/jpa-enumerated/target/classes - INFO - Configuring enterprise application: /Users/dblevins/openejb/examples/jpa-enumerated - INFO - Configuring Service(id=Default Stateful Container, type=Container, provider-id=Default Stateful Container) - INFO - Auto-creating a container for bean Movies: Container(type=STATEFUL, id=Default Stateful Container) - INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container) - INFO - Auto-creating a container for bean org.superbiz.jpa.enums.MoviesTest: Container(type=MANAGED, id=Default Managed Container) - INFO - Configuring PersistenceUnit(name=movie-unit) - INFO - Auto-creating a Resource with id 'movieDatabaseNonJta' of type 'DataSource for 'movie-unit'. - INFO - Configuring Service(id=movieDatabaseNonJta, type=Resource, provider-id=movieDatabase) - INFO - Adjusting PersistenceUnit movie-unit <non-jta-data-source> to Resource ID 'movieDatabaseNonJta' from 'movieDatabaseUnmanaged' - INFO - Enterprise application "/Users/dblevins/openejb/examples/jpa-enumerated" loaded. - INFO - Assembling app: /Users/dblevins/openejb/examples/jpa-enumerated - INFO - PersistenceUnit(name=movie-unit, provider=org.apache.openjpa.persistence.PersistenceProviderImpl) - provider time 406ms - INFO - Jndi(name="java:global/jpa-enumerated/Movies!org.superbiz.jpa.enums.Movies") - INFO - Jndi(name="java:global/jpa-enumerated/Movies") - INFO - Created Ejb(deployment-id=Movies, ejb-name=Movies, container=Default Stateful Container) - INFO - Started Ejb(deployment-id=Movies, ejb-name=Movies, container=Default Stateful Container) - INFO - Deployed Application(path=/Users/dblevins/openejb/examples/jpa-enumerated) - INFO - Undeploying app: /Users/dblevins/openejb/examples/jpa-enumerated - INFO - Closing DataSource: movieDatabase - INFO - Closing DataSource: movieDatabaseNonJta - Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.831 sec - - Results : - - Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 http://git-wip-us.apache.org/repos/asf/tomee/blob/a68903e7/examples/jpa-hibernate/README.adoc ---------------------------------------------------------------------- diff --git a/examples/jpa-hibernate/README.adoc b/examples/jpa-hibernate/README.adoc new file mode 100644 index 0000000..0bb85f1 --- /dev/null +++ b/examples/jpa-hibernate/README.adoc @@ -0,0 +1,213 @@ += JPA Hibernate +:index-group: JPA +:jbake-type: page +:jbake-status: published + +This example shows the persist, remove and creation a query in JPA Hibernate. +The Java Persistence API (JPA) is a Java specification for accessing, persisting, and managing data between Java objects / classes and a relational database. + +== Movie + +Define the class Movie as an entity with de annotation @Entity + +.... +package org.superbiz.injection.h3jpa; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Movie { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + + private String director; + private String title; + private int year; + + public Movie() { + } + + public Movie(String director, String title, int year) { + this.director = director; + this.title = title; + this.year = year; + } + + public String getDirector() { + return director; + } + + public void setDirector(String director) { + this.director = director; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public int getYear() { + return year; + } + + public void setYear(int year) { + this.year = year; + } + +} +.... + +== Movies + +@PersistenceContext A persistence context is a set of entities such that for any persistent identity there is a unique entity instance. +@EntityManager is associated with a persistence context. Is at the core of JPA, supported by some methods: persist, remove,merge, find, + +.... +package org.superbiz.injection.h3jpa; + +import javax.ejb.Stateful; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.PersistenceContextType; +import javax.persistence.Query; +import java.util.List; + +@Stateful +public 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(); + } +} +.... + +== persistence.xml + + <persistence version="1.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_1_0.xsd"> + <persistence-unit name="movie-unit"> + <provider>org.hibernate.ejb.HibernatePersistence</provider> + <jta-data-source>movieDatabase</jta-data-source> + <non-jta-data-source>movieDatabaseUnmanaged</non-jta-data-source> + <properties> + <property name="hibernate.hbm2ddl.auto" value="create-drop"/> + <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> + </properties> + </persistence-unit> + </persistence> + +== MoviesTest + +.... +package org.superbiz.injection.h3jpa; + +import junit.framework.TestCase; + +import javax.ejb.embeddable.EJBContainer; +import javax.naming.Context; +import java.util.List; +import java.util.Properties; + +/** + * @version $Revision: 607077 $ $Date: 2007-12-27 06:55:23 -0800 (Thu, 27 Dec 2007) $ + */ +public class MoviesTest extends TestCase { + + public void test() throws Exception { + final Properties p = new Properties(); + p.put("movieDatabase", "new://Resource?type=DataSource"); + p.put("movieDatabase.JdbcDriver", "org.hsqldb.jdbcDriver"); + p.put("movieDatabase.JdbcUrl", "jdbc:hsqldb:mem:moviedb"); + + final Context context = EJBContainer.createEJBContainer(p).getContext(); + Movies movies = (Movies) context.lookup("java:global/jpa-hibernate/Movies"); + + movies.addMovie(new Movie("Quentin Tarantino", "Reservoir Dogs", 1992)); + movies.addMovie(new Movie("Joel Coen", "Fargo", 1996)); + movies.addMovie(new Movie("Joel Coen", "The Big Lebowski", 1998)); + + List<Movie> list = movies.getMovies(); + assertEquals("List.size()", 3, list.size()); + + for (Movie movie : list) { + movies.deleteMovie(movie); + } + + assertEquals("Movies.getMovies()", 0, movies.getMovies().size()); + } +} +.... + += Running + +To run the example via maven: + +cd jpa-hibernate +mvn clean install + +Which will generate output similar to the following: + +.... +------------------------------------------------------- + T E S T S +------------------------------------------------------- +Running org.superbiz.injection.h3jpa.MoviesTest +Apache OpenEJB 4.0.0-beta-1 build: 20111002-04:06 +http://tomee.apache.org/ +INFO - openejb.home = /Users/dblevins/examples/jpa-hibernate +INFO - openejb.base = /Users/dblevins/examples/jpa-hibernate +INFO - Using 'javax.ejb.embeddable.EJBContainer=true' +INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service) +INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager) +INFO - Configuring Service(id=movieDatabase, type=Resource, provider-id=Default JDBC Database) +INFO - Found EjbModule in classpath: /Users/dblevins/examples/jpa-hibernate/target/classes +INFO - Beginning load: /Users/dblevins/examples/jpa-hibernate/target/classes +INFO - Configuring enterprise application: /Users/dblevins/examples/jpa-hibernate +INFO - Configuring Service(id=Default Stateful Container, type=Container, provider-id=Default Stateful Container) +INFO - Auto-creating a container for bean Movies: Container(type=STATEFUL, id=Default Stateful Container) +INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container) +INFO - Auto-creating a container for bean org.superbiz.injection.h3jpa.MoviesTest: Container(type=MANAGED, id=Default Managed Container) +INFO - Configuring PersistenceUnit(name=movie-unit, provider=org.hibernate.ejb.HibernatePersistence) +INFO - Auto-creating a Resource with id 'movieDatabaseNonJta' of type 'DataSource for 'movie-unit'. +INFO - Configuring Service(id=movieDatabaseNonJta, type=Resource, provider-id=movieDatabase) +INFO - Adjusting PersistenceUnit movie-unit <non-jta-data-source> to Resource ID 'movieDatabaseNonJta' from 'movieDatabaseUnmanaged' +INFO - Enterprise application "/Users/dblevins/examples/jpa-hibernate" loaded. +INFO - Assembling app: /Users/dblevins/examples/jpa-hibernate +INFO - PersistenceUnit(name=movie-unit, provider=org.hibernate.ejb.HibernatePersistence) - provider time 631ms +INFO - Jndi(name="java:global/jpa-hibernate/Movies!org.superbiz.injection.h3jpa.Movies") +INFO - Jndi(name="java:global/jpa-hibernate/Movies") +INFO - Jndi(name="java:global/EjbModule1235930463/org.superbiz.injection.h3jpa.MoviesTest!org.superbiz.injection.h3jpa.MoviesTest") +INFO - Jndi(name="java:global/EjbModule1235930463/org.superbiz.injection.h3jpa.MoviesTest") +INFO - Created Ejb(deployment-id=Movies, ejb-name=Movies, container=Default Stateful Container) +INFO - Created Ejb(deployment-id=org.superbiz.injection.h3jpa.MoviesTest, ejb-name=org.superbiz.injection.h3jpa.MoviesTest, container=Default Managed Container) +INFO - Started Ejb(deployment-id=Movies, ejb-name=Movies, container=Default Stateful Container) +INFO - Started Ejb(deployment-id=org.superbiz.injection.h3jpa.MoviesTest, ejb-name=org.superbiz.injection.h3jpa.MoviesTest, container=Default Managed Container) +INFO - Deployed Application(path=/Users/dblevins/examples/jpa-hibernate) +Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.22 sec + +Results : + +Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 +.... http://git-wip-us.apache.org/repos/asf/tomee/blob/a68903e7/examples/jpa-hibernate/README.md ---------------------------------------------------------------------- diff --git a/examples/jpa-hibernate/README.md b/examples/jpa-hibernate/README.md deleted file mode 100644 index 081fad4..0000000 --- a/examples/jpa-hibernate/README.md +++ /dev/null @@ -1,209 +0,0 @@ -index-group=EntityManagers -type=page -status=published -title=JPA Hibernate -~~~~~~ - -This example shows the persist, remove and creation a query in JPA Hibernate. -The Java Persistence API (JPA) is a Java specification for accessing, persisting, and managing data between Java objects / classes and a relational database. - - -## Movie - -Define the class Movie as an entity with de annotation @Entity - - package org.superbiz.injection.h3jpa; - - import javax.persistence.Entity; - import javax.persistence.GeneratedValue; - import javax.persistence.GenerationType; - import javax.persistence.Id; - - @Entity - public class Movie { - - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private long id; - - private String director; - private String title; - private int year; - - public Movie() { - } - - public Movie(String director, String title, int year) { - this.director = director; - this.title = title; - this.year = year; - } - - public String getDirector() { - return director; - } - - public void setDirector(String director) { - this.director = director; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public int getYear() { - return year; - } - - public void setYear(int year) { - this.year = year; - } - - } - -## Movies - -@PersistenceContext A persistence context is a set of entities such that for any persistent identity there is a unique entity instance. -@EntityManager is associated with a persistence context. Is at the core of JPA, supported by some methods: persist, remove,merge, find, - - package org.superbiz.injection.h3jpa; - - import javax.ejb.Stateful; - import javax.persistence.EntityManager; - import javax.persistence.PersistenceContext; - import javax.persistence.PersistenceContextType; - import javax.persistence.Query; - import java.util.List; - - @Stateful - public 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(); - } - } - -## persistence.xml - - <persistence version="1.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_1_0.xsd"> - <persistence-unit name="movie-unit"> - <provider>org.hibernate.ejb.HibernatePersistence</provider> - <jta-data-source>movieDatabase</jta-data-source> - <non-jta-data-source>movieDatabaseUnmanaged</non-jta-data-source> - <properties> - <property name="hibernate.hbm2ddl.auto" value="create-drop"/> - <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> - </properties> - </persistence-unit> - </persistence> - - -## MoviesTest - - package org.superbiz.injection.h3jpa; - - import junit.framework.TestCase; - - import javax.ejb.embeddable.EJBContainer; - import javax.naming.Context; - import java.util.List; - import java.util.Properties; - - /** - * @version $Revision: 607077 $ $Date: 2007-12-27 06:55:23 -0800 (Thu, 27 Dec 2007) $ - */ - public class MoviesTest extends TestCase { - - public void test() throws Exception { - final Properties p = new Properties(); - p.put("movieDatabase", "new://Resource?type=DataSource"); - p.put("movieDatabase.JdbcDriver", "org.hsqldb.jdbcDriver"); - p.put("movieDatabase.JdbcUrl", "jdbc:hsqldb:mem:moviedb"); - - final Context context = EJBContainer.createEJBContainer(p).getContext(); - Movies movies = (Movies) context.lookup("java:global/jpa-hibernate/Movies"); - - movies.addMovie(new Movie("Quentin Tarantino", "Reservoir Dogs", 1992)); - movies.addMovie(new Movie("Joel Coen", "Fargo", 1996)); - movies.addMovie(new Movie("Joel Coen", "The Big Lebowski", 1998)); - - List<Movie> list = movies.getMovies(); - assertEquals("List.size()", 3, list.size()); - - for (Movie movie : list) { - movies.deleteMovie(movie); - } - - assertEquals("Movies.getMovies()", 0, movies.getMovies().size()); - } - } - -# Running - -To run the example via maven: - -cd jpa-hibernate -mvn clean install - -Which will generate output similar to the following: - - ------------------------------------------------------- - T E S T S - ------------------------------------------------------- - Running org.superbiz.injection.h3jpa.MoviesTest - Apache OpenEJB 4.0.0-beta-1 build: 20111002-04:06 - http://tomee.apache.org/ - INFO - openejb.home = /Users/dblevins/examples/jpa-hibernate - INFO - openejb.base = /Users/dblevins/examples/jpa-hibernate - INFO - Using 'javax.ejb.embeddable.EJBContainer=true' - INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service) - INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager) - INFO - Configuring Service(id=movieDatabase, type=Resource, provider-id=Default JDBC Database) - INFO - Found EjbModule in classpath: /Users/dblevins/examples/jpa-hibernate/target/classes - INFO - Beginning load: /Users/dblevins/examples/jpa-hibernate/target/classes - INFO - Configuring enterprise application: /Users/dblevins/examples/jpa-hibernate - INFO - Configuring Service(id=Default Stateful Container, type=Container, provider-id=Default Stateful Container) - INFO - Auto-creating a container for bean Movies: Container(type=STATEFUL, id=Default Stateful Container) - INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container) - INFO - Auto-creating a container for bean org.superbiz.injection.h3jpa.MoviesTest: Container(type=MANAGED, id=Default Managed Container) - INFO - Configuring PersistenceUnit(name=movie-unit, provider=org.hibernate.ejb.HibernatePersistence) - INFO - Auto-creating a Resource with id 'movieDatabaseNonJta' of type 'DataSource for 'movie-unit'. - INFO - Configuring Service(id=movieDatabaseNonJta, type=Resource, provider-id=movieDatabase) - INFO - Adjusting PersistenceUnit movie-unit <non-jta-data-source> to Resource ID 'movieDatabaseNonJta' from 'movieDatabaseUnmanaged' - INFO - Enterprise application "/Users/dblevins/examples/jpa-hibernate" loaded. - INFO - Assembling app: /Users/dblevins/examples/jpa-hibernate - INFO - PersistenceUnit(name=movie-unit, provider=org.hibernate.ejb.HibernatePersistence) - provider time 631ms - INFO - Jndi(name="java:global/jpa-hibernate/Movies!org.superbiz.injection.h3jpa.Movies") - INFO - Jndi(name="java:global/jpa-hibernate/Movies") - INFO - Jndi(name="java:global/EjbModule1235930463/org.superbiz.injection.h3jpa.MoviesTest!org.superbiz.injection.h3jpa.MoviesTest") - INFO - Jndi(name="java:global/EjbModule1235930463/org.superbiz.injection.h3jpa.MoviesTest") - INFO - Created Ejb(deployment-id=Movies, ejb-name=Movies, container=Default Stateful Container) - INFO - Created Ejb(deployment-id=org.superbiz.injection.h3jpa.MoviesTest, ejb-name=org.superbiz.injection.h3jpa.MoviesTest, container=Default Managed Container) - INFO - Started Ejb(deployment-id=Movies, ejb-name=Movies, container=Default Stateful Container) - INFO - Started Ejb(deployment-id=org.superbiz.injection.h3jpa.MoviesTest, ejb-name=org.superbiz.injection.h3jpa.MoviesTest, container=Default Managed Container) - INFO - Deployed Application(path=/Users/dblevins/examples/jpa-hibernate) - Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.22 sec - - Results : - - Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 -
