diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/index/Student.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/index/Student.java
new file mode 100644
index 0000000000..0a77cfbc9e
--- /dev/null
+++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/index/Student.java
@@ -0,0 +1,70 @@
+package com.baeldung.jpa.index;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Index;
+import javax.persistence.Table;
+import java.io.Serializable;
+import java.util.Objects;
+
+@Entity
+@Table(indexes = {
+ @Index(columnList = "firstName"),
+ @Index(name = "fn_index", columnList = "id"),
+ @Index(name = "multiIndex1", columnList = "firstName, lastName"),
+ @Index(name = "multiIndex2", columnList = "lastName, firstName"),
+ @Index(name = "multiSortIndex", columnList = "firstName, lastName DESC"),
+ @Index(name = "uniqueIndex", columnList = "firstName", unique = true),
+ @Index(name = "uniqueMultiIndex", columnList = "firstName, lastName", unique = true)
+})
+public class Student implements Serializable {
+ @Id
+ @GeneratedValue
+ private Long id;
+ private String firstName;
+ private String lastName;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ Student student = (Student) o;
+ return Objects.equals(id, student.id) &&
+ Objects.equals(firstName, student.firstName) &&
+ Objects.equals(lastName, student.lastName);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, firstName, lastName);
+ }
+}
diff --git a/persistence-modules/java-jpa-3/src/main/resources/META-INF/persistence.xml b/persistence-modules/java-jpa-3/src/main/resources/META-INF/persistence.xml
index 88378bd8db..8fe3a8bbf1 100644
--- a/persistence-modules/java-jpa-3/src/main/resources/META-INF/persistence.xml
+++ b/persistence-modules/java-jpa-3/src/main/resources/META-INF/persistence.xml
@@ -40,4 +40,19 @@
+
+ org.hibernate.jpa.HibernatePersistenceProvider
+ com.baeldung.jpa.index.Student
+ true
+
+
+
+
+
+
+
+
+
+
+
diff --git a/persistence-modules/java-jpa-3/src/main/resources/logback.xml b/persistence-modules/java-jpa-3/src/main/resources/logback.xml
index 2527fea245..8000740dd1 100644
--- a/persistence-modules/java-jpa-3/src/main/resources/logback.xml
+++ b/persistence-modules/java-jpa-3/src/main/resources/logback.xml
@@ -8,7 +8,7 @@
-
+
diff --git a/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/index/IndexIntegrationTest.java b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/index/IndexIntegrationTest.java
new file mode 100644
index 0000000000..f59450567b
--- /dev/null
+++ b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/index/IndexIntegrationTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.jpa.index;
+
+import org.hibernate.exception.ConstraintViolationException;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+import java.util.Optional;
+
+public class IndexIntegrationTest {
+ private static EntityManagerFactory factory;
+ private static EntityManager entityManager;
+
+ @BeforeClass
+ public static void setup() {
+ factory = Persistence.createEntityManagerFactory("jpa-index");
+ entityManager = factory.createEntityManager();
+ }
+
+ @Test
+ public void givenStudent_whenPersistStudentWithSameFirstName_thenConstraintViolationException() {
+ Student student = new Student();
+ student.setFirstName("FirstName");
+ student.setLastName("LastName");
+
+ Student student2 = new Student();
+ student2.setFirstName("FirstName");
+ student2.setLastName("LastName2");
+
+ entityManager.getTransaction().begin();
+ entityManager.persist(student);
+ entityManager.getTransaction().commit();
+
+ Assert.assertEquals(1L, (long) student.getId());
+
+ entityManager.getTransaction().begin();
+ try {
+ entityManager.persist(student2);
+ entityManager.getTransaction().commit();
+ Assert.fail("Should raise an exception - unique key violation");
+ } catch (Exception ex) {
+ Assert.assertTrue(Optional.of(ex).map(Throwable::getCause).map(Throwable::getCause).filter(x -> x instanceof ConstraintViolationException).isPresent());
+ } finally {
+ entityManager.getTransaction().rollback();
+ }
+ }
+}