Skip to content

Commit 3eb68a0

Browse files
committed
Add Jakarta Data dependency management and tests
1 parent e299fed commit 3eb68a0

File tree

13 files changed

+489
-1
lines changed

13 files changed

+489
-1
lines changed

bom/application/pom.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@
7171
<jakarta.json-api.version>2.1.3</jakarta.json-api.version>
7272
<jakarta.json.bind-api.version>3.0.1</jakarta.json.bind-api.version>
7373
<jakarta.mail-api.version>2.1.3</jakarta.mail-api.version>
74-
<jakarta.persistence-api.version>3.1.0</jakarta.persistence-api.version>
74+
<!--jakarta.persistence-api.version is located in the main pom -->
75+
<jakarta.data-api.version>1.0.1</jakarta.data-api.version>
7576
<jakarta.resource-api.version>2.1.0</jakarta.resource-api.version>
7677
<jakarta.servlet-api.version>6.0.0</jakarta.servlet-api.version>
7778
<jakarta.transaction-api.version>2.0.1</jakarta.transaction-api.version>
@@ -4386,6 +4387,11 @@
43864387
<artifactId>jakarta.persistence-api</artifactId>
43874388
<version>${jakarta.persistence-api.version}</version>
43884389
</dependency>
4390+
<dependency>
4391+
<groupId>jakarta.data</groupId>
4392+
<artifactId>jakarta.data-api</artifactId>
4393+
<version>${jakarta.data-api.version}</version>
4394+
</dependency>
43894395
<dependency>
43904396
<groupId>jakarta.resource</groupId>
43914397
<artifactId>jakarta.resource-api</artifactId>

docs/pom.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3219,6 +3219,17 @@
32193219
<versionString>${hibernate-search.version}</versionString>
32203220
</configuration>
32213221
</execution>
3222+
<execution>
3223+
<id>parse-version-jakarta-persistence</id>
3224+
<goals>
3225+
<goal>parse-version</goal>
3226+
</goals>
3227+
<phase>validate</phase>
3228+
<configuration>
3229+
<propertyPrefix>jakarta-persistence</propertyPrefix>
3230+
<versionString>${jakarta.persistence-api.version}</versionString>
3231+
</configuration>
3232+
</execution>
32223233
</executions>
32233234
</plugin>
32243235
<plugin>

docs/src/main/asciidoc/_attributes.adoc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
// overridden to the full version, at least when building locally.
3030
:hibernate-orm-version-major-minor: ${hibernate-orm.majorVersion}.${hibernate-orm.minorVersion}
3131
:hibernate-search-version-major-minor: ${hibernate-search.majorVersion}.${hibernate-search.minorVersion}
32+
:jakarta-persistence-version-major-minor: ${jakarta-persistence.majorVersion}.${jakarta-persistence.minorVersion}
3233
// .
3334
:quarkus-home-url: ${quarkus-home-url}
3435
:quarkus-org-url: https://github.com/quarkusio
@@ -54,6 +55,7 @@
5455
:hibernate-orm-docs-url: https://docs.jboss.org/hibernate/orm/{hibernate-orm-version-major-minor}/userguide/html_single/Hibernate_User_Guide.html
5556
:hibernate-orm-dialect-docs-url: https://docs.jboss.org/hibernate/orm/{hibernate-orm-version-major-minor}/dialect/dialect.html
5657
:hibernate-search-docs-url: https://docs.jboss.org/hibernate/search/{hibernate-search-version-major-minor}/reference/en-US/html_single/
58+
:jakarta-persistence-spec-url: https://jakarta.ee/specifications/persistence/{jakarta-persistence-version-major-minor}/jakarta-persistence-spec-{jakarta-persistence-version-major-minor}#a6072
5759
// .
5860
:amazon-services-guide: https://docs.quarkiverse.io/quarkus-amazon-services/dev/index.html
5961
:config-consul-guide: https://docs.quarkiverse.io/quarkus-config-extensions/dev/consul.html

docs/src/main/asciidoc/hibernate-orm.adoc

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1569,3 +1569,118 @@ Format mappers *must* have both `@PersistenceUnitExtension` and either `@JsonFor
15691569
15701570
Having multiple JSON (or XML) format mappers registered for the same persistence unit will result in an exception, because of the ambiguity.
15711571
====
1572+
1573+
[[jakarta-data]]
1574+
== Static metamodel and Jakarta Data
1575+
1576+
Both static metamodel and Jakarta Data capabilities of Hibernate ORM are available to the users
1577+
through the `hibernate-jpamodelgen` annotation processor. Since it is an annotation processor,
1578+
users are required to make an extra step of configuring the annotation processor in their build tool of choice:
1579+
1580+
[source,xml,role="primary asciidoc-tabs-target-sync-cli asciidoc-tabs-target-sync-maven"]
1581+
.pom.xml
1582+
----
1583+
<plugin>
1584+
<artifactId>maven-compiler-plugin</artifactId>
1585+
<configuration>
1586+
<annotationProcessorPaths>
1587+
<path>
1588+
<groupId>org.hibernate.orm</groupId>
1589+
<artifactId>hibernate-jpamodelgen</artifactId>
1590+
<!-- Note, no artifact version is required, it's managed by Quarkus. -->
1591+
</path>
1592+
<!-- other processors that may be required by your app -->
1593+
</annotationProcessorPaths>
1594+
<!-- Other compiler plugin configuration options -->
1595+
</configuration>
1596+
</plugin>
1597+
----
1598+
1599+
[source,gradle,role="secondary asciidoc-tabs-target-sync-gradle"]
1600+
.build.gradle
1601+
----
1602+
// Enforce the version management of your annotation processor dependencies,
1603+
// so that there's no need to define an explicit version of the hibernate-jpamodelgen
1604+
annotationProcessor enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")
1605+
annotationProcessor 'org.hibernate.orm:hibernate-jpamodelgen'
1606+
----
1607+
1608+
=== Static metamodel
1609+
1610+
The generated static metamodel allows for building queries in a type-safe manner.
1611+
Let's consider having a simple entity:
1612+
1613+
[source,java]
1614+
----
1615+
@Entity
1616+
public class MyEntity {
1617+
@Id
1618+
@GeneratedValue
1619+
public Integer id;
1620+
1621+
@Column(unique = true)
1622+
public String name;
1623+
}
1624+
----
1625+
1626+
A query created with the help of static metamodel may look as:
1627+
1628+
[source,java]
1629+
----
1630+
var builder = session.getCriteriaBuilder();
1631+
var query = builder.createQuery(MyEntity.class);
1632+
var e = query.from(MyEntity_.class_);
1633+
query.where(e.get(MyEntity_.name).equalTo(name));
1634+
session.createQuery(query)....
1635+
----
1636+
1637+
For a more detailed overview of static metamodel, please refer to the link:{jakarta-persistence-spec-url}#a6072[Jakarta Persistence specification]
1638+
1639+
=== Jakarta Data
1640+
1641+
Jakarta Data requires, besides having the `hibernate-jpamodelgen` annotation processor in place, one extra dependency to be added:
1642+
1643+
[source,xml,role="primary asciidoc-tabs-target-sync-cli asciidoc-tabs-target-sync-maven"]
1644+
.pom.xml
1645+
----
1646+
<dependency>
1647+
<groupId>jakarta.data</groupId>
1648+
<artifactId>jakarta.data-api</artifactId>
1649+
</dependency>
1650+
----
1651+
1652+
[source,gradle,role="secondary asciidoc-tabs-target-sync-gradle"]
1653+
.build.gradle
1654+
----
1655+
implementation 'jakarta.data:jakarta.data-api'
1656+
----
1657+
1658+
With this dependency, and the annotation processor in place you could simply create your repositories as follows:
1659+
1660+
[source,java]
1661+
----
1662+
@Repository
1663+
public interface MyRepository {
1664+
1665+
@Find
1666+
Optional<MyEntity> findById(Integer id);
1667+
1668+
@Query("select e from MyEntity e where e.name like :name")
1669+
List<MyEntity> findByName(String name);
1670+
1671+
@Insert
1672+
void insert(MyEntity entity);
1673+
1674+
@Update
1675+
void update(MyEntity entity);
1676+
1677+
@Delete
1678+
void delete(MyEntity entity);
1679+
1680+
}
1681+
----
1682+
1683+
Please refer to the corresponding https://hibernate.org/repositories/[Hibernate Data Repositories]
1684+
and https://jakarta.ee/specifications/data/1.0/jakarta-data-1.0[Jakarta Data]
1685+
guides to learn what else they have to offer.
1686+
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>quarkus-integration-tests-parent</artifactId>
7+
<groupId>io.quarkus</groupId>
8+
<version>999-SNAPSHOT</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
12+
<artifactId>quarkus-integration-test-hibernate-orm-data</artifactId>
13+
<name>Quarkus - Integration Tests - Hibernate ORM with Jakarta Data</name>
14+
15+
<dependencies>
16+
<dependency>
17+
<groupId>io.quarkus</groupId>
18+
<artifactId>quarkus-hibernate-orm</artifactId>
19+
</dependency>
20+
<dependency>
21+
<groupId>jakarta.data</groupId>
22+
<artifactId>jakarta.data-api</artifactId>
23+
</dependency>
24+
<dependency>
25+
<groupId>io.quarkus</groupId>
26+
<artifactId>quarkus-rest</artifactId>
27+
</dependency>
28+
<dependency>
29+
<groupId>io.quarkus</groupId>
30+
<artifactId>quarkus-rest-jackson</artifactId>
31+
</dependency>
32+
<dependency>
33+
<groupId>io.quarkus</groupId>
34+
<artifactId>quarkus-jdbc-h2</artifactId>
35+
</dependency>
36+
37+
<!-- test dependencies -->
38+
<dependency>
39+
<groupId>io.quarkus</groupId>
40+
<artifactId>quarkus-junit5</artifactId>
41+
<scope>test</scope>
42+
</dependency>
43+
<dependency>
44+
<groupId>io.quarkus</groupId>
45+
<artifactId>quarkus-junit5-internal</artifactId>
46+
<scope>test</scope>
47+
</dependency>
48+
<dependency>
49+
<groupId>io.rest-assured</groupId>
50+
<artifactId>rest-assured</artifactId>
51+
<scope>test</scope>
52+
</dependency>
53+
<dependency>
54+
<groupId>org.assertj</groupId>
55+
<artifactId>assertj-core</artifactId>
56+
<scope>test</scope>
57+
</dependency>
58+
59+
<!-- Minimal test dependencies to *-deployment artifacts for consistent build order -->
60+
<dependency>
61+
<groupId>io.quarkus</groupId>
62+
<artifactId>quarkus-hibernate-orm-deployment</artifactId>
63+
<version>${project.version}</version>
64+
<type>pom</type>
65+
<scope>test</scope>
66+
<exclusions>
67+
<exclusion>
68+
<groupId>*</groupId>
69+
<artifactId>*</artifactId>
70+
</exclusion>
71+
</exclusions>
72+
</dependency>
73+
<dependency>
74+
<groupId>io.quarkus</groupId>
75+
<artifactId>quarkus-jdbc-h2-deployment</artifactId>
76+
<version>${project.version}</version>
77+
<type>pom</type>
78+
<scope>test</scope>
79+
<exclusions>
80+
<exclusion>
81+
<groupId>*</groupId>
82+
<artifactId>*</artifactId>
83+
</exclusion>
84+
</exclusions>
85+
</dependency>
86+
<dependency>
87+
<groupId>io.quarkus</groupId>
88+
<artifactId>quarkus-rest-deployment</artifactId>
89+
<version>${project.version}</version>
90+
<type>pom</type>
91+
<scope>test</scope>
92+
<exclusions>
93+
<exclusion>
94+
<groupId>*</groupId>
95+
<artifactId>*</artifactId>
96+
</exclusion>
97+
</exclusions>
98+
</dependency>
99+
<dependency>
100+
<groupId>io.quarkus</groupId>
101+
<artifactId>quarkus-rest-jackson-deployment</artifactId>
102+
<version>${project.version}</version>
103+
<type>pom</type>
104+
<scope>test</scope>
105+
<exclusions>
106+
<exclusion>
107+
<groupId>*</groupId>
108+
<artifactId>*</artifactId>
109+
</exclusion>
110+
</exclusions>
111+
</dependency>
112+
</dependencies>
113+
114+
<build>
115+
<resources>
116+
<resource>
117+
<directory>src/main/resources</directory>
118+
<filtering>true</filtering>
119+
</resource>
120+
</resources>
121+
<plugins>
122+
<plugin>
123+
<groupId>io.quarkus</groupId>
124+
<artifactId>quarkus-maven-plugin</artifactId>
125+
<executions>
126+
<execution>
127+
<goals>
128+
<goal>build</goal>
129+
</goals>
130+
</execution>
131+
</executions>
132+
</plugin>
133+
<plugin>
134+
<artifactId>maven-compiler-plugin</artifactId>
135+
<configuration>
136+
<annotationProcessorPaths>
137+
<path>
138+
<groupId>org.hibernate.orm</groupId>
139+
<artifactId>hibernate-jpamodelgen</artifactId>
140+
</path>
141+
</annotationProcessorPaths>
142+
</configuration>
143+
</plugin>
144+
</plugins>
145+
</build>
146+
147+
148+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package io.quarkus.it.hibernate.jpamodelgen.data;
2+
3+
import jakarta.persistence.Column;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.GeneratedValue;
6+
import jakarta.persistence.Id;
7+
8+
@Entity
9+
public class MyEntity {
10+
11+
@Id
12+
@GeneratedValue
13+
public Integer id;
14+
15+
@Column(unique = true)
16+
public String name;
17+
18+
MyEntity() {
19+
}
20+
21+
public MyEntity(String name) {
22+
this.name = name;
23+
}
24+
25+
@Override
26+
public String toString() {
27+
return "MyOrmEntity [id=" + id + ", name=" + name + "]";
28+
}
29+
30+
}

0 commit comments

Comments
 (0)