diff --git a/persistence-modules/hibernate-queries/pom.xml b/persistence-modules/hibernate-queries/pom.xml
index e530ea2555..68a46b82b1 100644
--- a/persistence-modules/hibernate-queries/pom.xml
+++ b/persistence-modules/hibernate-queries/pom.xml
@@ -79,6 +79,12 @@
jmh-generator-annprocess
${jmh-generator.version}
+
+ org.testcontainers
+ mysql
+ ${testcontainers.mysql.version}
+ test
+
@@ -88,6 +94,7 @@
6.0.6
2.2.3
2.1.214
+ 1.17.6
\ No newline at end of file
diff --git a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/keywords/BrokenPhoneOrder.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/keywords/BrokenPhoneOrder.java
new file mode 100644
index 0000000000..e045005f28
--- /dev/null
+++ b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/keywords/BrokenPhoneOrder.java
@@ -0,0 +1,39 @@
+package com.baeldung.hibernate.keywords;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "broken_phone_order")
+public class BrokenPhoneOrder implements Serializable {
+ @Id
+ @Column(name = "order")
+ String order;
+ @Column(name = "where")
+ String where;
+
+ public BrokenPhoneOrder(String order, String where) {
+ this.order = order;
+ this.where = where;
+ }
+
+ public String getOrder() {
+ return order;
+ }
+
+ public void setOrder(String order) {
+ this.order = order;
+ }
+
+ public String getWhere() {
+ return where;
+ }
+
+ public void setWhere(String where) {
+ this.where = where;
+ }
+}
diff --git a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/keywords/PhoneOrder.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/keywords/PhoneOrder.java
new file mode 100644
index 0000000000..daee57d553
--- /dev/null
+++ b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/keywords/PhoneOrder.java
@@ -0,0 +1,39 @@
+package com.baeldung.hibernate.keywords;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "phone_order")
+public class PhoneOrder implements Serializable {
+ @Id
+ @Column(name = "`order`")
+ String order;
+ @Column(name = "`where`")
+ String where;
+
+ public PhoneOrder(String order, String where) {
+ this.order = order;
+ this.where = where;
+ }
+
+ public String getOrder() {
+ return order;
+ }
+
+ public void setOrder(String order) {
+ this.order = order;
+ }
+
+ public String getWhere() {
+ return where;
+ }
+
+ public void setWhere(String where) {
+ this.where = where;
+ }
+}
diff --git a/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/keywords/HibernateKeywordsApplicationIntegrationTest.java b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/keywords/HibernateKeywordsApplicationIntegrationTest.java
new file mode 100644
index 0000000000..4282da3de4
--- /dev/null
+++ b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/keywords/HibernateKeywordsApplicationIntegrationTest.java
@@ -0,0 +1,58 @@
+package com.baeldung.hibernate.keywords;
+
+import static java.util.UUID.randomUUID;
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
+
+import javax.persistence.PersistenceException;
+
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.Configuration;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+public class HibernateKeywordsApplicationIntegrationTest {
+
+ private static SessionFactory sessionFactory;
+ private Session session;
+
+ @BeforeAll
+ static void createSession() {
+ sessionFactory = new Configuration().addAnnotatedClass(BrokenPhoneOrder.class)
+ .addAnnotatedClass(PhoneOrder.class)
+ .configure("keywords/hibernate.keywords.cfg.xml")
+ .buildSessionFactory();
+ }
+
+ @BeforeEach
+ void before() {
+ session = sessionFactory.openSession();
+ session.beginTransaction();
+ }
+
+ @AfterEach
+ void after() {
+ session.close();
+ }
+
+ @Test
+ void givenBrokenPhoneOrderWithReservedKeywords_whenNewObjectIsPersisted_thenItFails() {
+ BrokenPhoneOrder order = new BrokenPhoneOrder(randomUUID().toString(), "My House");
+
+ assertThatExceptionOfType(PersistenceException.class).isThrownBy(() -> {
+ session.persist(order);
+ session.flush();
+ });
+ }
+
+ @Test
+ void givenPhoneOrderWithEscapedKeywords_whenNewObjectIsPersisted_thenItSucceeds() {
+ PhoneOrder order = new PhoneOrder(randomUUID().toString(), "here");
+
+ session.persist(order);
+ session.flush();
+ }
+
+}
diff --git a/persistence-modules/hibernate-queries/src/test/resources/keywords/hibernate.keywords.cfg.xml b/persistence-modules/hibernate-queries/src/test/resources/keywords/hibernate.keywords.cfg.xml
new file mode 100644
index 0000000000..9a1b6bb775
--- /dev/null
+++ b/persistence-modules/hibernate-queries/src/test/resources/keywords/hibernate.keywords.cfg.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+ org.hibernate.dialect.MySQLDialect
+ jdbc:tc:mysql:5.7.41:///restaurant?TC_INITSCRIPT=keywords/init.sql
+ org.testcontainers.jdbc.ContainerDatabaseDriver
+ validate
+ true
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-queries/src/test/resources/keywords/init.sql b/persistence-modules/hibernate-queries/src/test/resources/keywords/init.sql
new file mode 100644
index 0000000000..4d42a45f5b
--- /dev/null
+++ b/persistence-modules/hibernate-queries/src/test/resources/keywords/init.sql
@@ -0,0 +1,9 @@
+CREATE TABLE IF NOT EXISTS phone_order (
+ `order` varchar(255) PRIMARY KEY,
+ `where` varchar(255)
+);
+
+CREATE TABLE IF NOT EXISTS broken_phone_order (
+ `order` varchar(255) PRIMARY KEY,
+ `where` varchar(255)
+);
\ No newline at end of file