You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomee.apache.org by GitBox <gi...@apache.org> on 2021/05/11 22:15:01 UTC

[GitHub] [tomee] cesarhernandezgt commented on a change in pull request #789: TOMEE-3741 New Example and documentation JPA Hibernate 5 with arquillian

cesarhernandezgt commented on a change in pull request #789:
URL: https://github.com/apache/tomee/pull/789#discussion_r630574953



##########
File path: examples/jpa-hibernate-arquillian/README.adoc
##########
@@ -0,0 +1,323 @@
+= JPA Hibernate Arquillian
+:index-group: JPA
+:jbake-type: page
+:jbake-status: published
+
+This example shows the persist, remove and creation a query in JPA Hibernate 5 using arquillian for the test.
+
+The Java Persistence API (JPA) is a Java specification for accessing, persisting, and managing data between Java objects / classes and a relational database.
+
+To exemplify the use of JPA, we will persist an Object (Movie) in the database.
+
+Links to the documentation have been added in key parts of the example for the case of doubts and as a way to encourage their reading for details.
+
+== Movie
+
+Here we have a class with some details. See the annotation 
+link:https://tomee.apache.org/tomee-8.0/javadoc/javax/persistence/Entity.html[@Entity] 
+above the declaration, with it we are saying that this class is an entity (a table in the database). We still have two more annotations above the attribute id, one of them is 
+link:https://tomee.apache.org/tomee-8.0/javadoc/javax/persistence/Id.html[@Id] 
+annotation, it indicates that this attribute is the identifier of the entity and the other annotation 
+link:https://tomee.apache.org/tomee-8.0/javadoc/javax/persistence/GeneratedValue.html[@GeneratedValue] 
+indicates that the unique identifier value generation of the entity will be managed by the persistence provider.
+
+[source,java]
+----
+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
+
+Now we have two important things: 
+link:https://tomee.apache.org/tomee-8.0/javadoc/javax/persistence/PersistenceContext.html[@PersistenceContext] 
+annotation and the 
+link:https://tomee.apache.org/tomee-8.0/javadoc/javax/persistence/EntityManager.html[EntityManager] 
+declaration.
+The 
+link:https://tomee.apache.org/tomee-8.0/javadoc/javax/persistence/EntityManager.html[EntityManager] 
+is the interface with the core methods of JPA like persist, remove, merge, find and others...
+We annotate the 
+link:https://tomee.apache.org/tomee-8.0/javadoc/javax/persistence/EntityManager.html[EntityManager] 
+with 
+link:https://tomee.apache.org/tomee-8.0/javadoc/javax/persistence/PersistenceContext.html[@PersistenceContext], a persistence context is an entity management where  every persistence context associated with a persistence unit, we will create a persistence.xml soon for this.
+
+[source,java]
+----
+import javax.ejb.Stateful;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.PersistenceContextType;
+import javax.persistence.Query;
+import javax.persistence.criteria.*;
+import javax.persistence.metamodel.EntityType;
+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();
+    }
+
+    public int count(String field, String searchTerm) {
+        CriteriaBuilder qb = entityManager.getCriteriaBuilder();
+        CriteriaQuery<Long> cq = qb.createQuery(Long.class);
+        Root<Movie> root = cq.from(Movie.class);
+        EntityType<Movie> type = entityManager.getMetamodel().entity(Movie.class);
+        cq.select(qb.count(root));
+        if (field != null && searchTerm != null && !"".equals(field.trim()) && !"".equals(searchTerm.trim())) {
+            Path<String> path = root.get(type.getDeclaredSingularAttribute(field.trim(), String.class));
+            Predicate condition = qb.like(path, "%" + searchTerm.trim() + "%");
+            cq.where(condition);
+        }
+        return entityManager.createQuery(cq).getSingleResult().intValue();
+    }
+
+}
+----
+
+== persistence.xml
+
+Here we define which database will persist our movies, and we perform other configurations such as: define a persistence-unit with the name movie-unit, followed by the definition of the JPA provider/implementation (in this case Hibernate 5) and we set some properties for hibernate 5:
+
+----
+ <persistence 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"
+             version="2.0">
+    <persistence-unit name="movie-unit">
+        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
+        <jta-data-source>movieDatabase</jta-data-source>
+        <non-jta-data-source>movieDatabaseUnmanaged</non-jta-data-source>
+        <class>org.superbiz.injection.h3jpa.Movie</class>
+        <properties>
+            <property name="hibernate.hbm2ddl.auto" value="update"/>
+            <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
+            <property name="hibernate.show_sql" value="true"/>
+
+            <!--
+            JPA and CDI are linked, enabling JPA to use CDI for its
+            components but CDI can use JPA too. To solve issues with
+            hibernate you need to this property either as system property
+            or persistence unit
+            -->
+            <property name="tomee.jpa.factory.lazy" value="true"/>
+        </properties>
+    </persistence-unit>
+</persistence>
+----
+
+
+== arquillian.xml
+This file provides the configuration the server will have for running the tests.
+The property `additionalLibs` provide to the server the jar files required for Hibernate 5 as explained in the http://tomee.apache.org/latest/docs/tomee-and-hibernate.html[TomEE and Hibernate] documentation.

Review comment:
       Nice catch, fixed in commit ea49d8a9bf

##########
File path: examples/jpa-hibernate-arquillian/README.adoc
##########
@@ -0,0 +1,323 @@
+= JPA Hibernate Arquillian
+:index-group: JPA
+:jbake-type: page
+:jbake-status: published
+
+This example shows the persist, remove and creation a query in JPA Hibernate 5 using arquillian for the test.

Review comment:
       Thank you, also fixed in commit ea49d8a9bf




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org