Skip to content

Commit b4c7bd8

Browse files
committed
Introduce validation modes instead of a boolean flag for BV integration in ORM
as well as switch to AUTO instead of the CALLBACK to enable the DDL integration by default.
1 parent 1bdd69f commit b4c7bd8

File tree

9 files changed

+170
-9
lines changed

9 files changed

+170
-9
lines changed

extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmConfigPersistenceUnit.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -664,9 +664,38 @@ interface HibernateOrmConfigPersistenceValidation {
664664

665665
/**
666666
* Enables the Bean Validation integration.
667+
*
668+
* @deprecated Use {@link #modes()} instead.
667669
*/
670+
@Deprecated(since = "3.19", forRemoval = true)
668671
@WithDefault("true")
669672
boolean enabled();
673+
674+
/**
675+
* Defines how the Bean Validation integration behaves.
676+
*/
677+
@WithDefault("AUTO")
678+
Set<ValidationMode> modes();
679+
680+
enum ValidationMode {
681+
/**
682+
* If a Bean Validation provider is present then behaves as if both {@link ValidationMode#CALLBACK} and
683+
* {@link ValidationMode#DDL} modes are configured. Otherwise, same as {@link ValidationMode#NONE}.
684+
*/
685+
AUTO,
686+
/**
687+
* Bean Validation will perform the lifecycle event validation.
688+
*/
689+
CALLBACK,
690+
/**
691+
* Bean Validation constraints will be considered for the DDL operations.
692+
*/
693+
DDL,
694+
/**
695+
* Bean Validation integration will be disabled.
696+
*/
697+
NONE
698+
}
670699
}
671700

672701
}

extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmProcessor.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1103,15 +1103,15 @@ private static void producePersistenceUnitDescriptorFromConfig(
11031103
p.put(JAKARTA_SHARED_CACHE_MODE, SharedCacheMode.NONE);
11041104
}
11051105

1106-
// Hibernate Validator integration: we force the callback mode to have bootstrap errors reported rather than validation ignored
1107-
// if there is any issue when bootstrapping Hibernate Validator.
1108-
if (capabilities.isPresent(Capability.HIBERNATE_VALIDATOR)) {
1109-
if (persistenceUnitConfig.validation().enabled()) {
1110-
descriptor.getProperties().setProperty(AvailableSettings.JAKARTA_VALIDATION_MODE,
1111-
ValidationMode.CALLBACK.name());
1112-
} else {
1113-
descriptor.getProperties().setProperty(AvailableSettings.JAKARTA_VALIDATION_MODE, ValidationMode.NONE.name());
1114-
}
1106+
if (!persistenceUnitConfig.validation().enabled()) {
1107+
descriptor.getProperties().setProperty(AvailableSettings.JAKARTA_VALIDATION_MODE, ValidationMode.NONE.name());
1108+
} else {
1109+
descriptor.getProperties().setProperty(
1110+
AvailableSettings.JAKARTA_VALIDATION_MODE,
1111+
persistenceUnitConfig.validation().modes()
1112+
.stream()
1113+
.map(Enum::name)
1114+
.collect(Collectors.joining(",")));
11151115
}
11161116

11171117
// Discriminator Column

extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/validation/JPATestValidationResource.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@
77
import jakarta.persistence.EntityManager;
88
import jakarta.transaction.Transactional;
99
import jakarta.validation.ConstraintViolationException;
10+
import jakarta.ws.rs.GET;
1011
import jakarta.ws.rs.POST;
1112
import jakarta.ws.rs.Path;
1213

14+
import org.hibernate.engine.spi.SessionFactoryImplementor;
15+
1316
import io.quarkus.hibernate.orm.MyEntity;
1417

1518
@Path("/validation")
@@ -35,4 +38,16 @@ public String save(String name) {
3538
.collect(Collectors.joining());
3639
}
3740
}
41+
42+
@GET
43+
public String ddl() {
44+
return "nullable: " + em.getEntityManagerFactory()
45+
.unwrap(SessionFactoryImplementor.class)
46+
.getMappingMetamodel()
47+
.getEntityDescriptor(MyEntity.class)
48+
.getEntityMappingType()
49+
.getAttributeMapping(0)
50+
.getAttributeMetadata()
51+
.isNullable();
52+
}
3853
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package io.quarkus.hibernate.orm.validation;
2+
3+
import static org.hamcrest.Matchers.is;
4+
5+
import org.junit.jupiter.api.Test;
6+
import org.junit.jupiter.api.extension.RegisterExtension;
7+
8+
import io.quarkus.hibernate.orm.MyEntity;
9+
import io.quarkus.test.QuarkusUnitTest;
10+
import io.restassured.RestAssured;
11+
12+
public class JPAValidationModeAutoTestCase {
13+
14+
@RegisterExtension
15+
static QuarkusUnitTest runner = new QuarkusUnitTest()
16+
.withApplicationRoot((jar) -> jar
17+
.addClasses(MyEntity.class, JPATestValidationResource.class)
18+
.addAsResource("application-validation-mode-auto.properties", "application.properties"));
19+
20+
@Test
21+
public void testInValidEntity() {
22+
String entityName = "Post method should not persist an entity having a Size constraint of 50 on the name column if validation was enabled.";
23+
RestAssured.given().body(entityName).when().post("/validation").then()
24+
.body(is("entity name too long"));
25+
}
26+
27+
@Test
28+
public void testDDL() {
29+
RestAssured.when().get("/validation").then()
30+
.body(is("nullable: false"));
31+
}
32+
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package io.quarkus.hibernate.orm.validation;
2+
3+
import static org.hamcrest.Matchers.is;
4+
5+
import org.junit.jupiter.api.Test;
6+
import org.junit.jupiter.api.extension.RegisterExtension;
7+
8+
import io.quarkus.hibernate.orm.MyEntity;
9+
import io.quarkus.test.QuarkusUnitTest;
10+
import io.restassured.RestAssured;
11+
12+
public class JPAValidationModeMultipleTestCase {
13+
14+
@RegisterExtension
15+
static QuarkusUnitTest runner = new QuarkusUnitTest()
16+
.withApplicationRoot((jar) -> jar
17+
.addClasses(MyEntity.class, JPATestValidationResource.class)
18+
.addAsResource("application-validation-mode-multiple.properties", "application.properties"));
19+
20+
@Test
21+
public void testValidEntity() {
22+
String entityName = "Post method should not persist an entity having a Size constraint of 50 on the name column if validation was enabled.";
23+
RestAssured.given().body(entityName).when().post("/validation").then()
24+
.body(is("entity name too long"));
25+
}
26+
27+
@Test
28+
public void testDDL() {
29+
RestAssured.when().get("/validation").then()
30+
.body(is("nullable: false"));
31+
}
32+
33+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package io.quarkus.hibernate.orm.validation;
2+
3+
import static org.hamcrest.Matchers.is;
4+
5+
import org.junit.jupiter.api.Test;
6+
import org.junit.jupiter.api.extension.RegisterExtension;
7+
8+
import io.quarkus.hibernate.orm.MyEntity;
9+
import io.quarkus.test.QuarkusUnitTest;
10+
import io.restassured.RestAssured;
11+
12+
public class JPAValidationModeNoneTestCase {
13+
14+
@RegisterExtension
15+
static QuarkusUnitTest runner = new QuarkusUnitTest()
16+
.withApplicationRoot((jar) -> jar
17+
.addClasses(MyEntity.class, JPATestValidationResource.class)
18+
.addAsResource("application-validation-mode-none.properties", "application.properties"));
19+
20+
@Test
21+
public void testValidEntity() {
22+
String entityName = "Post method should not persist an entity having a Size constraint of 50 on the name column if validation was enabled.";
23+
RestAssured.given().body(entityName).when().post("/validation").then()
24+
.body(is("OK"));
25+
}
26+
27+
@Test
28+
public void testDDL() {
29+
RestAssured.when().get("/validation").then()
30+
.body(is("nullable: true"));
31+
}
32+
33+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
quarkus.datasource.db-kind=h2
2+
quarkus.datasource.jdbc.url=jdbc:h2:mem:test
3+
4+
#quarkus.hibernate-orm.log.sql=true
5+
#quarkus.hibernate-orm.validation.modes=AUTO
6+
quarkus.hibernate-orm.database.generation=drop-and-create
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
quarkus.datasource.db-kind=h2
2+
quarkus.datasource.jdbc.url=jdbc:h2:mem:test
3+
4+
#quarkus.hibernate-orm.log.sql=true
5+
quarkus.hibernate-orm.validation.modes=callback,ddl
6+
quarkus.hibernate-orm.database.generation=drop-and-create
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
quarkus.datasource.db-kind=h2
2+
quarkus.datasource.jdbc.url=jdbc:h2:mem:test
3+
4+
#quarkus.hibernate-orm.log.sql=true
5+
quarkus.hibernate-orm.validation.modes=none
6+
quarkus.hibernate-orm.database.generation=drop-and-create

0 commit comments

Comments
 (0)