
1. Overview
In this short tutorial, we’ll highlight how to fix the Hibernate error “DuplicateMappingException: Column is duplicated in mapping for entity“.
First, we’ll look at the main cause of the exception. Then, we’ll demonstrate how to reproduce it using a practical example. Then, finally, we’ll solve it.
2. Understanding DuplicateMappingException
Before moving forward with the solution, let’s take a moment to understand the exception.
In short, DuplicateMappingException is a subclass of MappingException that provides more specific error handling for duplicate object-relational mappings.
Furthermore, the message “Column is duplicated in mapping for entity” occurs when the same column is mapped multiple times within an entity class. In this case, Hibernate doesn’t know how to handle the duplication.
3. Reproducing DuplicateMappingException
Now that we know what causes Hibernate to fail with DuplicateMappingException, let’s roll up our sleeves and reproduce it in practice.
First of all, let’s consider the Person entity class:
@Entity
public class Person {
@Id
private int id;
@Column(name = "first_name")
private String firstName;
@Column(name = "first_name") // oh no!
private String lastName;
// standard getters and setters
}
In a nutshell, a person is defined by an identifier, first name, and last name. The @Entity annotation indicates that the Person class is a JPA entity, while the @Id annotation denotes the primary key. Moreover, the @Column annotation maps each entity field to a particular table column.
As we can see, we pretend here to map both fields, firstName and lastName, to the same column first_name. Now, let’s see the exception using a test case:
@Test
void whenDuplicatingColumnMapping_thenThrowMappingException() {
assertThatThrownBy(() -> {
session = HibernateUtil.getSessionFactory()
.openSession();
session.beginTransaction();
session.createQuery("FROM Person", Person.class)
.list();
session.close();
}).isInstanceOf(DuplicateMappingException.class)
.hasMessageContaining("Column 'first_name' is duplicated in mapping for entity");
}
As shown above, Hibernate throws a DuplicateMappingException because we used the same column to map the fields firstName and lastName.
4. Fixing the Exception
As we noted earlier, the root cause of DuplicateMappingException is binding the same column to several fields. So, the easiest solution would be to map each field to a unique column.
First, let’s update the Person class and map the lastName property to another column:
@Column(name = "last_name")
private String lastName;
Now, we’ll create another test to make sure that everything works as expected:
@Test
void whenNotDuplicatingColumnMapping_thenCorrect() {
session = HibernateUtil.getSessionFactory()
.openSession();
session.beginTransaction();
assertThat(session.createQuery("FROM Person", Person.class)
.list()).isEmpty();
session.close();
}
Unsurprisingly, the test case is successfully executed and doesn’t fail with DuplicateMappingException.
5. Conclusion
In this short article, we discussed what causes Hibernate to throw DuplicateMappingException: Column is duplicated in mapping for entity by reproducing it. And then we showed how to solve it. The reproducer for this exception can be found over on GitHub.
The post Fixing the Hibernate Error “DuplicateMappingException: Column is Duplicated in Mapping For Entity” first appeared on Baeldung.