Skip to content

Commit 070693a

Browse files
committed
Jakarta EE example
1 parent 68e6eb8 commit 070693a

File tree

6 files changed

+317
-1
lines changed

6 files changed

+317
-1
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ This repository contains examples on how to connect to [MariaDB](https://mariadb
1818

1919
## Jakarta EE (Java EE)
2020

21-
(work in progress)
21+
- [Jakarta EE + GlassFish](jakarta-ee/): Jakarta EE is set of vendor-neutral specifications to build enterprise Java applications.
2222

2323
## Quarkus
2424

jakarta-ee/README.md

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
# Jakarta EE / Eclipse GlassFish quickstart
2+
3+
[Jakarta EE](https://jakarta.ee) is a set of vendor-neutral APIs for developing Java cloud-native applications that require enterprise features like distributed computing and web services.
4+
5+
This Maven project shows the minimal configuration needed to connect to MariaDB databases using JPA in a Jakarta EE application deployed to [Eclipse GlassFish](https://glassfish.org).
6+
7+
## LT;DR (kinda)
8+
9+
Add the Jakarta EE API:
10+
11+
```xml
12+
<dependency>
13+
<groupId>jakarta.platform</groupId>
14+
<artifactId>jakarta.jakartaee-api</artifactId>
15+
<version>9.1.0</version>
16+
<scope>provided</scope>
17+
</dependency>
18+
```
19+
20+
Define a Persistence Unit:
21+
22+
```xml
23+
<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">
24+
<persistence-unit name="jakarta-ee-demo" transaction-type="JTA">
25+
<jta-data-source>mariadb-database</jta-data-source>
26+
</persistence-unit>
27+
</persistence>
28+
```
29+
30+
Implement a JPA Entity and define a named query ([JPQL](https://jakarta.ee/specifications/persistence/3.1/jakarta-persistence-spec-3.1.html#a4665)):
31+
32+
```Java
33+
@Entity
34+
@Table(name = "programming_language")
35+
@NamedQuery(name = "topProgrammingLanguages", query = "from ProgrammingLanguage pl where pl.rating > :rating")
36+
public class ProgrammingLanguage {
37+
38+
@Id
39+
@GeneratedValue(strategy = GenerationType.IDENTITY)
40+
@Column(name = "pl_id")
41+
private Integer id;
42+
43+
@Column(name = "pl_name")
44+
private String name;
45+
46+
@Column(name = "pl_rating")
47+
private Integer rating;
48+
49+
... equals, hashCode, getters and setters ...
50+
51+
}
52+
```
53+
54+
Inject an `EntityManager`:
55+
56+
```java
57+
@PersistenceContext(unitName = "jakarta-ee-demo")
58+
private EntityManager entityManager;
59+
```
60+
61+
Execute queries:
62+
63+
```java
64+
TypedQuery<ProgrammingLanguage> query = entityManager.createNamedQuery(
65+
"topProgrammingLanguages", ProgrammingLanguage.class);
66+
query.setParameter("rating", 5);
67+
List<ProgrammingLanguage> programmingLanguages = query.getResultList();
68+
```
69+
70+
## Requirements
71+
- Java 17 or later. Previous versions should work (update the version in the pom.xml file).
72+
Apache Maven.
73+
- Eclipse GlassFish 6.2.5 or later.
74+
- MariaDB server. If you don't want to install anything extra, try creating a free [SkySQL account](https://cloud.mariadb.com).
75+
- MariaDB Connector/J 3.0.4 or later.
76+
- An SQL client tool like mariadb, DBeaver, or an SQL integration for your IDE.
77+
78+
## Running the app
79+
80+
Prepare the database:
81+
82+
```sql
83+
CREATE DATABASE jakartaee_demo;
84+
CREATE USER 'user'@'%';
85+
GRANT ALL ON jakartaee_demo.* TO 'user'@'%' IDENTIFIED BY 'password';
86+
FLUSH PRIVILEGES;
87+
88+
USE jakartaee_demo;
89+
CREATE TABLE programming_language(
90+
pl_id INT PRIMARY KEY AUTOINCREMENT,
91+
pl_name VARCHAR(50) NOT NULL UNIQUE,
92+
pl_rating INT
93+
);
94+
```
95+
96+
[Download MariaDB Connector/J](https://mariadb.com/downloads/connectors/connectors-data-access/java8-connector) (select Java8+ connector) and place the JAR in the **lib** directory of the fault GlassFish domain:
97+
98+
```
99+
cp ~/Downloads/mariadb-java-client-3.0.4.jar [GLASSFISH_HOME]/glassfish/domains/domain1/lib
100+
```
101+
102+
Start the GlassFish application server:
103+
104+
```
105+
[GLASSFISH_HOME]/bin/asadmin start-domain
106+
```
107+
108+
Configure the database connection pool using the [Administration Console](https://glassfish.org/docs/latest/administration-guide/overview.html#GSADG00698) by going to **Resources > JDBC > JDBC Connection Pools**. Click **New** and fill in the following details:
109+
110+
* **Pool Name**: `MariaDB`
111+
* **Resource Type**: `java.sql.Driver`
112+
113+
Click **Next** and fill in the following details:
114+
115+
* **Driver Classname**: `org.mariadb.jdbc.Driver`
116+
117+
Click **Finish**.
118+
119+
In the JDBC Connection Pool list, click the newly created pool, select the **Additional Properties** tab, and add the following properties using the **Add Property** button:
120+
121+
* **url**: `jdbc:mariadb://localhost:3306/jakartaee_demo`
122+
* **user**: `user`
123+
* **password**: `password`
124+
125+
Go to **Resources > JDBC > JDBC Resources**. Click **New** and fill in the following details:
126+
127+
* **JNDI Name**: `mariadb-database`
128+
* **Pool Name**: `MariaDB`
129+
130+
Build the WAR file:
131+
132+
```
133+
git clone [email protected]:mariadb-developers/java-quickstart.git
134+
cd java-quickstart/jakarta-ee/
135+
mvn package
136+
```
137+
138+
Deploy the WAR file to GlassFish using the Administration Console. Go to **Applications** and click te button next to the **Location** field, select the WAR file (**java-quickstart/jakarta-ee/target/jakarta-ee-1.0-SNAPSHOT.war**), and click **Ok**.
139+
140+
You should be able to see new rows in the `programming_language` table in the database as well as log messages confirming that data was deleted, created, and read. Go to **Monitoring Data > server** and click the **View Log Files** button.

jakarta-ee/pom.xml

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
3+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
6+
<groupId>com.example</groupId>
7+
<artifactId>jakarta-ee</artifactId>
8+
<version>1.0-SNAPSHOT</version>
9+
<packaging>war</packaging>
10+
11+
<properties>
12+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
13+
<maven.compiler.source>17</maven.compiler.source>
14+
<maven.compiler.target>17</maven.compiler.target>
15+
</properties>
16+
17+
<dependencies>
18+
<dependency>
19+
<groupId>jakarta.platform</groupId>
20+
<artifactId>jakarta.jakartaee-api</artifactId>
21+
<version>9.1.0</version>
22+
<scope>provided</scope>
23+
</dependency>
24+
</dependencies>
25+
26+
<build>
27+
<plugins>
28+
<plugin>
29+
<groupId>org.apache.maven.plugins</groupId>
30+
<artifactId>maven-war-plugin</artifactId>
31+
<version>3.3.2</version>
32+
</plugin>
33+
<plugin>
34+
<groupId>org.apache.maven.plugins</groupId>
35+
<artifactId>maven-compiler-plugin</artifactId>
36+
<version>3.10.1</version>
37+
</plugin>
38+
</plugins>
39+
</build>
40+
</project>
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.example;
2+
3+
import java.util.Arrays;
4+
import java.util.List;
5+
import java.util.logging.Logger;
6+
7+
import jakarta.annotation.PostConstruct;
8+
import jakarta.ejb.Singleton;
9+
import jakarta.ejb.Startup;
10+
import jakarta.persistence.EntityManager;
11+
import jakarta.persistence.PersistenceContext;
12+
import jakarta.persistence.TypedQuery;
13+
import jakarta.transaction.Transactional;
14+
15+
@Singleton
16+
@Startup
17+
public class Application {
18+
19+
private static final Logger log = Logger.getAnonymousLogger();
20+
21+
@PersistenceContext(unitName = "jakarta-ee-demo")
22+
private EntityManager entityManager;
23+
24+
@PostConstruct
25+
public void run() {
26+
deleteProgrammingLanguages();
27+
createProgrammingLanguages();
28+
printTopProgrammingLanguages();
29+
}
30+
31+
@Transactional
32+
public void deleteProgrammingLanguages() {
33+
log.info("Deleting programming languages...");
34+
entityManager.createQuery("delete from ProgrammingLanguage pl").executeUpdate();
35+
}
36+
37+
@Transactional
38+
public void createProgrammingLanguages() {
39+
log.info("Creating programming languages...");
40+
Arrays.stream("Java,C++,C#,JavaScript,Rust,Go,Python,PHP".split(","))
41+
.map(name -> new ProgrammingLanguage(name, (int) (Math.random() * 10)))
42+
.forEach(entityManager::persist);
43+
}
44+
45+
public void printTopProgrammingLanguages() {
46+
log.info("Top programming languages:");
47+
48+
TypedQuery<ProgrammingLanguage> query = entityManager.createNamedQuery(
49+
"topProgrammingLanguages", ProgrammingLanguage.class);
50+
query.setParameter("rating", 5);
51+
List<ProgrammingLanguage> programmingLanguages = query.getResultList();
52+
53+
programmingLanguages.stream()
54+
.map(pl -> pl.getName() + ": " + pl.getRating())
55+
.forEach(System.out::println);
56+
}
57+
58+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package com.example;
2+
3+
import jakarta.persistence.*;
4+
5+
import java.util.Objects;
6+
7+
@Entity
8+
@Table(name = "programming_language")
9+
@NamedQuery(name = "topProgrammingLanguages", query = "from ProgrammingLanguage pl where pl.rating > :rating")
10+
public class ProgrammingLanguage {
11+
12+
@Id
13+
@GeneratedValue(strategy = GenerationType.IDENTITY)
14+
@Column(name = "pl_id")
15+
private Integer id;
16+
17+
@Column(name = "pl_name")
18+
private String name;
19+
20+
@Column(name = "pl_rating")
21+
private Integer rating;
22+
23+
public ProgrammingLanguage() {
24+
}
25+
26+
public ProgrammingLanguage(String name, Integer rating) {
27+
this.name = name;
28+
this.rating = rating;
29+
}
30+
31+
@Override
32+
public boolean equals(Object o) {
33+
if (this == o)
34+
return true;
35+
if (o == null || getClass() != o.getClass())
36+
return false;
37+
ProgrammingLanguage that = (ProgrammingLanguage) o;
38+
return Objects.equals(id, that.id);
39+
}
40+
41+
@Override
42+
public int hashCode() {
43+
return Objects.hash(id);
44+
}
45+
46+
public Integer getId() {
47+
return id;
48+
}
49+
50+
public void setId(Integer id) {
51+
this.id = id;
52+
}
53+
54+
public String getName() {
55+
return name;
56+
}
57+
58+
public void setName(String name) {
59+
this.name = name;
60+
}
61+
62+
public Integer getRating() {
63+
return rating;
64+
}
65+
66+
public void setRating(Integer rating) {
67+
this.rating = rating;
68+
}
69+
70+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<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">
2+
<persistence-unit name="jakarta-ee-demo" transaction-type="JTA">
3+
<jta-data-source>mariadb-database</jta-data-source> <!-- Use the same name in the application server -->
4+
<properties>
5+
<property name="eclipselink.target-database" value="MySQL"/> <!-- EclipseLink JPA (default JPA implementation in Glassfish) requires this -->
6+
</properties>
7+
</persistence-unit>
8+
</persistence>

0 commit comments

Comments
 (0)