blob: 6f3d892ca1f2889a4521faefb8dbb4bbb49113ad [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Apache TomEE</title>
<meta name="description"
content="Apache TomEE is a lightweight, yet powerful, JavaEE Application server with feature rich tooling." />
<meta name="keywords" content="tomee,asf,apache,javaee,jee,shade,embedded,test,junit,applicationcomposer,maven,arquillian" />
<meta name="author" content="Luka Cvetinovic for Codrops" />
<link rel="icon" href="../../../favicon.ico">
<link rel="icon" type="image/png" href="../../../favicon.png">
<meta name="msapplication-TileColor" content="#80287a">
<meta name="theme-color" content="#80287a">
<link rel="stylesheet" type="text/css" href="../../../css/normalize.css">
<link rel="stylesheet" type="text/css" href="../../../css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="../../../css/owl.css">
<link rel="stylesheet" type="text/css" href="../../../css/animate.css">
<link rel="stylesheet" type="text/css" href="../../../fonts/font-awesome-4.1.0/css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="../../../fonts/eleganticons/et-icons.css">
<link rel="stylesheet" type="text/css" href="../../../css/jqtree.css">
<link rel="stylesheet" type="text/css" href="../../../css/idea.css">
<link rel="stylesheet" type="text/css" href="../../../css/cardio.css">
<script type="text/javascript">
<!-- Matomo -->
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
/* We explicitly disable cookie tracking to avoid privacy issues */
_paq.push(['disableCookies']);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function () {
var u = "//matomo.privacy.apache.org/";
_paq.push(['setTrackerUrl', u + 'matomo.php']);
_paq.push(['setSiteId', '5']);
var d = document, g = d.createElement('script'), s = d.getElementsByTagName('script')[0];
g.async = true;
g.src = u + 'matomo.js';
s.parentNode.insertBefore(g, s);
})();
<!-- End Matomo Code -->
</script>
</head>
<body>
<div class="preloader">
<img src="../../../img/loader.gif" alt="Preloader image">
</div>
<nav class="navbar">
<div class="container">
<div class="row"> <div class="col-md-12">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/" title="Apache TomEE">
<span>
<img
src="../../../img/apache_tomee-logo.svg"
onerror="this.src='../../../img/apache_tomee-logo.jpg'"
height="50"
>
</span>
</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav navbar-right main-nav">
<li><a href="../../../docs.html">Documentation</a></li>
<li><a href="../../../community/index.html">Community</a></li>
<li><a href="../../../security/security.html">Security</a></li>
<li><a class="btn btn-accent accent-orange no-shadow" href="../../../download.html">Downloads</a></li>
</ul>
</div>
<!-- /.navbar-collapse -->
</div></div>
</div>
<!-- /.container-fluid -->
</nav>
<div id="main-block" class="container main-block">
<div class="row title">
<div class="col-md-12">
<div class='page-header'>
<h1>Inyeccion del EntityManager</h1>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>En éste ejemplo y se muestra el uso de <code>@PersistenceContext</code> para tener um <code>EntityManager</code> con un
persistence context <code>EXTENDED</code>, inyecctado en un bean <code>@Stateful</code>. Un bean del tipo <code>@Entity</code> JPA, se
utiliza con el <code>EntityManager</code> para crear y actualizar los datos en una base de datos.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_la_creación_de_una_entidad_jpa">La creación de una entidad JPA</h2>
<div class="sectionbody">
<div class="paragraph">
<p>La entidad por sí es simplemente un pojo con la anotación <code>@Entity</code>. Nosotros creamos una llamada <code>Movie</code> Lo que podemos usar para mantener registros de películas.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>package org.superbiz.injection.jpa;</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>import jakarta.persistence.Entity;</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>@Entity
public class Movie {</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>@Id @GeneratedValue
private long id;</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>private String director;
private String title;
private int year;</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>public Movie() {
}</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>public long getId() {
return id;
}</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>public void setId(long id) {
this.id = id;
}</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>public Movie(String director, String title, int year) {
this.director = director;
this.title = title;
this.year = year;
}</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>public String getDirector() {
return director;
}</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>public void setDirector(String director) {
this.director = director;
}</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>public String getTitle() {
return title;
}</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>public void setTitle(String title) {
this.title = title;
}</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>public int getYear() {
return year;
}</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre> public void setYear(int year) {
this.year = year;
}
}</pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_configure_el_entitymanager_a_través_de_un_archivo_persistence_xml">Configure el EntityManager a través de un archivo persistence.xml</h2>
<div class="sectionbody">
<div class="paragraph">
<p>La entidad <code>Movie</code> encima se puede crear, eliminado, actualizado a través de un objeto <code>EntityManager</code>. Lo <code>EntityManager</code> sí mismo es configurado a través de un archivo <code>META-INF/persistence.xml</code> que se coloca en el mismo jar como la entidad <code>Movie</code>.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>&lt;persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0"&gt;</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>&lt;persistence-unit name="movie-unit"&gt;
&lt;jta-data-source&gt;movieDatabase&lt;/jta-data-source&gt;
&lt;non-jta-data-source&gt;movieDatabaseUnmanaged&lt;/non-jta-data-source&gt;
&lt;class&gt;org.superbiz.injection.jpa.Movie&lt;/class&gt;</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre> &lt;properties&gt;
&lt;property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/&gt;
&lt;/properties&gt;
&lt;/persistence-unit&gt;
&lt;/persistence&gt;</pre>
</div>
</div>
<div class="paragraph">
<p>Note que la entidad <code>Movie</code> aparece a través de un elemento <code>&lt;class&gt;</code>. Esto no es necesario, pero puede ayudar a realizar la prueba o cuando clase <code>Movie</code> se encuentra en un jar diferente que el jar que contiene el archivo <code>persistence.xml</code>.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_inyección_vía_persistencecontext">Inyección vía @PersistenceContext</h2>
<div class="sectionbody">
<div class="paragraph">
<p>El <code>EntityManager</code> en sí mismo es creado por el contenedor utilizando la información en el <code>persistence.xml</code>, así que para usarlo en
tiempo de ejecución, simplemente necesitamos solicitar que se inyecte en uno de nuestros componentes. Nosotros podemos hacer esto a través de <code>@PersistenceContext</code></p>
</div>
<div class="paragraph">
<p>La anotación <code>@PersistenceContext</code> se puede utilizar en cualquier bean CDI, EJB, Servlet, Servlet Listener, Servlet Filter, o JSF ManagedBean.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>package org.superbiz.injection.jpa;</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>import jakarta.ejb.Stateful;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.persistence.PersistenceContextType;
import jakarta.persistence.Query;
import java.util.List;</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>@Stateful
public class Movies {</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>@PersistenceContext(unitName = "movie-unit", type = PersistenceContextType.EXTENDED)
private EntityManager entityManager;</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>public void addMovie(Movie movie) throws Exception {
entityManager.persist(movie);
}</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>public void deleteMovie(Movie movie) throws Exception {
entityManager.remove(movie);
}</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre> public List&lt;Movie&gt; getMovies() throws Exception {
Query query = entityManager.createQuery("SELECT m from Movie as m");
return query.getResultList();
}
}</pre>
</div>
</div>
<div class="paragraph">
<p>Este particular <code>EntityManager</code> se inyecta como un contexto de persistencia <code>EXTENDED</code>, lo que simplemente significa que el <code>EntityManager</code> se crea cuando el <code>@Stateful</code> el bean se crea y destruye cuando el <code>@Stateful</code> bean es destruido. En pocas palabras, el datos en el <code>EntityManager</code> se almacena en caché durante la vida útil del bean <code>@Stateful</code>.</p>
</div>
<div class="paragraph">
<p>El uso de <code>EXTENDED</code> contextos de persistencia es <strong>solamente</strong> disponible para beans <code>@Stateful</code>. Ver el [JPA Concepts](../../jpa-concepts.html)</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_moviestest">MoviesTest</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Probar JPA es bastante fácil, simplemente podemos usar el <code>EJBContainer</code> API para crear un contenedor en nuestro caso de prueba.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>package org.superbiz.injection.jpa;</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>import junit.framework.TestCase;</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>import jakarta.ejb.embeddable.EJBContainer;
import javax.naming.Context;
import java.util.List;
import java.util.Properties;</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>//START SNIPPET: code
public class MoviesTest extends TestCase {</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>public void test() throws Exception {</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>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");</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>final Context context = EJBContainer.createEJBContainer(p).getContext();</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>Movies movies = (Movies) context.lookup("java:global/injection-of-entitymanager/Movies");</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>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));</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>List&lt;Movie&gt; list = movies.getMovies();
assertEquals("List.size()", 3, list.size());</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>for (Movie movie : list) {
movies.deleteMovie(movie);
}</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre> assertEquals("Movies.getMovies()", 0, movies.getMovies().size());
}
}</pre>
</div>
</div>
</div>
</div>
<h1 id="_ejecutar_la_aplicación" class="sect0">Ejecutar la aplicación</h1>
<div class="paragraph">
<p>Cuando ejecutamos nuestro caso de prueba, deberíamos ver un resultado similar al siguiente.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>-------------------------------------------------------
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 'jakarta.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 &lt;non-jta-data-source&gt; 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</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>Results :</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>Tests run: 1, Failures: 0, Errors: 0, Skipped: 0</pre>
</div>
</div>
<div class="sect1">
<h2 id="_pruebas_de_rendimiento">Pruebas de Rendimiento</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_prerrequisitos">Prerrequisitos</h3>
<div class="ulist">
<ul>
<li>
<p>Oralce DB</p>
<div class="ulist">
<ul>
<li>
<p>Actualiza tu maven archivo <code>setings.xml</code> para contener en el sección <code>&lt;servers&gt;</code> la siguiente entrada:</p>
<div class="literalblock">
<div class="content">
<pre>```xml
&lt;server&gt;
&lt;id&gt;maven.oracle.com &lt;/id&gt;
&lt;username&gt;YourOracleAccountUsername&lt;/username&gt;
&lt;password&gt;YourOracleAccountPassword&lt;/password&gt;
&lt;configuration&gt;
&lt;basicAuthScope&gt;
&lt;host&gt;ANY &lt;/host&gt;
&lt;port&gt;ANY &lt;/port&gt;
&lt;realm&gt;OAM 11g &lt;/realm&gt;
&lt;/basicAuthScope&gt;
&lt;httpConfiguration&gt;
&lt;all&gt;
&lt;params&gt;
&lt;property&gt;
&lt;name&gt;http.protocol.allow-circular-redirects &lt;/name&gt;
&lt;value&gt;%b,true &lt;/value&gt;
&lt;/property&gt;
&lt;/params&gt;
&lt;/all&gt;
&lt;/httpConfiguration&gt;
&lt;/configuration&gt;
&lt;/server&gt;
```</pre>
</div>
</div>
</li>
<li>
<p>Actualiza archivo <code>pom.xml</code>, sección <code>&lt;dependency&gt;</code> con lo siguiente:</p>
<div class="literalblock">
<div class="content">
<pre>```xml
&lt;dependency&gt;
&lt;groupId&gt;com.oracle.jdbc&lt;/groupId&gt;
&lt;artifactId&gt;ojdbc8&lt;/artifactId&gt;
&lt;version&gt;18.3.0.0&lt;/version&gt;
&lt;scope&gt;provided&lt;/scope&gt;
&lt;/dependency&gt;
```</pre>
</div>
</div>
</li>
<li>
<p>Actualiza archivo <code>pom.xml</code>, sección <code>&lt;repositories&gt;</code> con lo siguiente:</p>
<div class="literalblock">
<div class="content">
<pre>```xml
&lt;repository&gt;
&lt;id&gt;maven.oracle.com&lt;/id&gt;
&lt;name&gt;oracle-maven-repo&lt;/name&gt;
&lt;url&gt;https://maven.oracle.com&lt;/url&gt;
&lt;layout&gt;default&lt;/layout&gt;
&lt;releases&gt;
&lt;enabled&gt;true&lt;/enabled&gt;
&lt;updatePolicy&gt;always&lt;/updatePolicy&gt;
&lt;/releases&gt;
&lt;/repository&gt;
```</pre>
</div>
</div>
</li>
<li>
<p>Actualiza archivo <code>pom.xml</code>, después sección <code>&lt;/repositories&gt;</code>, agregue lo siguiente:</p>
<div class="literalblock">
<div class="content">
<pre>```xml
&lt;pluginRepositories&gt;
&lt;pluginRepository&gt;
&lt;id&gt;maven.oracle.com&lt;/id&gt;
&lt;name&gt;oracle-maven-repo&lt;/name&gt;
&lt;url&gt;https://maven.oracle.com&lt;/url&gt;
&lt;layout&gt;default&lt;/layout&gt;
&lt;releases&gt;
&lt;enabled&gt;true&lt;/enabled&gt;
&lt;updatePolicy&gt;always&lt;/updatePolicy&gt;
&lt;/releases&gt;
&lt;/pluginRepository&gt;
&lt;/pluginRepositories&gt;
```</pre>
</div>
</div>
</li>
<li>
<p>Actualiza archivo <code>pom.xml</code>, agregue el tipo de jar JDBC para el tomee-maven-plugin:</p>
<div class="literalblock">
<div class="content">
<pre>```xml
&lt;plugin&gt;
&lt;groupId&gt;org.apache.tomee.maven&lt;/groupId&gt;
&lt;artifactId&gt;tomee-maven-plugin&lt;/artifactId&gt;
&lt;version&gt;${tomee.version}&lt;/version&gt;
&lt;configuration&gt;
&lt;tomeeVersion&gt;${tomee.version}&lt;/tomeeVersion&gt;
&lt;tomeeClassifier&gt;plume&lt;/tomeeClassifier&gt;
&lt;tomeeHttpPort&gt;9080&lt;/tomeeHttpPort&gt;
&lt;tomeeShutdownPort&gt;9005&lt;/tomeeShutdownPort&gt;
&lt;libs&gt;
&lt;lib&gt;com.oracle.jdbc:ojdbc8:18.3.0.0&lt;/lib&gt;
&lt;/libs&gt;
&lt;/configuration&gt;
&lt;/plugin&gt;
```</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>Para más Oracle JDBC Maven configuración que puede comprobar [Artículo Oracle](https://blogs.oracle.com/dev2dev/get-oracle-jdbc-drivers-and-u</pre>
</div>
</div>
</li>
</ul>
</div>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_ejecutar_la_aplicación_2">Ejecutar la aplicación</h3>
<div class="paragraph">
<p>Desde una terminal</p>
</div>
<div class="literalblock">
<div class="content">
<pre>mvn clean install tomee:run</pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_ejecutar_la_consola_de_grinder">Ejecutar la consola de Grinder</h3>
<div class="paragraph">
<p>En una nueva terminal ejecutar:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>./grinder.sh</pre>
</div>
</div>
<div class="paragraph">
<p>Una vez que la consola UI está disponible, presiona el botón <code>Start the worker processes</code>
La prueba de carga continuará hasta que presione en la consola el botón <code>Stop the worker processes and the agent processes</code></p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_apis_used">APIs Used</h2>
<div class="sectionbody">
<div class="ulist">
<ul>
<li>
<p><a href="../../../tomee-9.0/javadoc/org/apache/openejb/jee/EjbJar.html">org.apache.openejb.jee.EjbJar</a></p>
</li>
<li>
<p><a href="../../../tomee-9.0/javadoc/org/apache/openejb/jee/jpa/unit/PersistenceUnit.html">org.apache.openejb.jee.jpa.unit.PersistenceUnit</a></p>
</li>
<li>
<p><a href="../../../tomee-9.0/javadoc/org/apache/openejb/junit/ApplicationComposer.html">org.apache.openejb.junit.ApplicationComposer</a></p>
</li>
<li>
<p><a href="../../../tomee-9.0/javadoc/org/apache/openejb/loader/Files.html">org.apache.openejb.loader.Files</a></p>
</li>
<li>
<p><a href="../../../tomee-9.0/javadoc/org/apache/openejb/testing/Classes.html">org.apache.openejb.testing.Classes</a></p>
</li>
<li>
<p><a href="../../../tomee-9.0/javadoc/org/apache/openejb/testing/Configuration.html">org.apache.openejb.testing.Configuration</a></p>
</li>
<li>
<p><a href="../../../tomee-9.0/javadoc/org/apache/openejb/testing/Module.html">org.apache.openejb.testing.Module</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/annotation/PostConstruct.html">jakarta.annotation.PostConstruct</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/annotation/Resource.html">jakarta.annotation.Resource</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/ejb/EJB.html">jakarta.ejb.EJB</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/ejb/EJBException.html">jakarta.ejb.EJBException</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/ejb/Lock.html">jakarta.ejb.Lock</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/ejb/LockType.html">jakarta.ejb.LockType</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/ejb/Singleton.html">jakarta.ejb.Singleton</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/ejb/Startup.html">jakarta.ejb.Startup</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/ejb/embeddable/EJBContainer.html">jakarta.ejb.embeddable.EJBContainer</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/persistence/Entity.html">jakarta.persistence.Entity</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/persistence/EntityManager.html">jakarta.persistence.EntityManager</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/persistence/GeneratedValue.html">jakarta.persistence.GeneratedValue</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/persistence/Id.html">jakarta.persistence.Id</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/persistence/PersistenceContext.html">jakarta.persistence.PersistenceContext</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/persistence/PersistenceContextType.html">jakarta.persistence.PersistenceContextType</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/persistence/Query.html">jakarta.persistence.Query</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/transaction/RollbackException.html">jakarta.transaction.RollbackException</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/transaction/SystemException.html">jakarta.transaction.SystemException</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/transaction/TransactionManager.html">jakarta.transaction.TransactionManager</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/ws/rs/GET.html">jakarta.ws.rs.GET</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/ws/rs/Path.html">jakarta.ws.rs.Path</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/ws/rs/Produces.html">jakarta.ws.rs.Produces</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/ws/rs/WebApplicationException.html">jakarta.ws.rs.WebApplicationException</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/ws/rs/core/MediaType.html">jakarta.ws.rs.core.MediaType</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/ws/rs/core/Response.html">jakarta.ws.rs.core.Response</a></p>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
<div style="margin-bottom: 30px;"></div>
<footer>
<div class="container">
<div class="row">
<div class="col-sm-6 text-center-mobile">
<h3 class="white">Be simple. Be certified. Be Tomcat.</h3>
<h5 class="light regular light-white">"A good application in a good server"</h5>
<ul class="social-footer">
<li><a href="https://www.facebook.com/ApacheTomEE/"><i class="fa fa-facebook"></i></a></li>
<li><a href="https://twitter.com/apachetomee"><i class="fa fa-twitter"></i></a></li>
</ul>
<h5 class="light regular light-white">
<a href="../../../privacy-policy.html" class="white">Privacy Policy</a>
</h5>
</div>
<div class="col-sm-6 text-center-mobile">
<div class="row opening-hours">
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../../latest/docs/" class="white">Documentation</a></h5>
<ul class="list-unstyled">
<li><a href="../../../latest/docs/admin/configuration/index.html" class="regular light-white">How to configure</a></li>
<li><a href="../../../latest/docs/admin/file-layout.html" class="regular light-white">Dir. Structure</a></li>
<li><a href="../../../latest/docs/developer/testing/index.html" class="regular light-white">Testing</a></li>
<li><a href="../../../latest/docs/admin/cluster/index.html" class="regular light-white">Clustering</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../../latest/examples/" class="white">Examples</a></h5>
<ul class="list-unstyled">
<li><a href="../../../latest/examples/simple-cdi-interceptor.html" class="regular light-white">CDI Interceptor</a></li>
<li><a href="../../../latest/examples/rest-cdi.html" class="regular light-white">REST with CDI</a></li>
<li><a href="../../../latest/examples/ejb-examples.html" class="regular light-white">EJB</a></li>
<li><a href="../../../latest/examples/jsf-managedBean-and-ejb.html" class="regular light-white">JSF</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../../community/index.html" class="white">Community</a></h5>
<ul class="list-unstyled">
<li><a href="../../../community/contributors.html" class="regular light-white">Contributors</a></li>
<li><a href="../../../community/social.html" class="regular light-white">Social</a></li>
<li><a href="../../../community/sources.html" class="regular light-white">Sources</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../../security/index.html" class="white">Security</a></h5>
<ul class="list-unstyled">
<li><a href="https://apache.org/security" target="_blank" class="regular light-white">Apache Security</a></li>
<li><a href="https://apache.org/security/projects.html" target="_blank" class="regular light-white">Security Projects</a></li>
<li><a href="https://cve.mitre.org" target="_blank" class="regular light-white">CVE</a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="row bottom-footer text-center-mobile">
<div class="col-sm-12 light-white">
<p>Copyright &copy; 1999-2022 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. Apache TomEE, TomEE, Apache, the Apache feather logo, and the Apache TomEE project logo are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</p>
</div>
</div>
</div>
</footer>
<!-- Holder for mobile navigation -->
<div class="mobile-nav">
<ul>
<li><a hef="../../../latest/docs/admin/index.html">Administrators</a>
<li><a hef="../../../latest/docs/developer/index.html">Developers</a>
<li><a hef="../../../latest/docs/advanced/index.html">Advanced</a>
<li><a hef="../../../community/index.html">Community</a>
</ul>
<a href="#" class="close-link"><i class="arrow_up"></i></a>
</div>
<!-- Scripts -->
<script src="../../../js/jquery-1.11.1.min.js"></script>
<script src="../../../js/owl.carousel.min.js"></script>
<script src="../../../js/bootstrap.min.js"></script>
<script src="../../../js/wow.min.js"></script>
<script src="../../../js/typewriter.js"></script>
<script src="../../../js/jquery.onepagenav.js"></script>
<script src="../../../js/tree.jquery.js"></script>
<script src="../../../js/highlight.pack.js"></script>
<script src="../../../js/main.js"></script>
</body>
</html>