JPA Pitfalls – a Series of Serious JPA Obstacles

Most of our Java-based web-applications store their data in a relational database such as Oracle, PostgreSQL, MySQL, MariaDB or MS SQLServer. The standard way to access and modify the data is using an object-relational mapping as specified by the Java Persistence API (JPA). Over the years JPA has become a mature specification and there are a couple of JPA implementations with strong support such as Hibernate, EclipseLink, OpenJPA and DataNucleus. However, day-to-day project experience demonstrates there are number of pitfalls you might run into when using JPA.


To avoid stumbling into the same pitfall again and again, we collected them with their solutions and presented these pairs of problems and solutions. This is a start of a series of blog articles each describing a pitfall and a way to circumvent it.

For every pitfall, there is a description and an executable code example. You find all the code examples here:

We have four categories of pitfalls. Each new pitfall will be added as a new list item:

  1. Object-relational mapping and relationships
    1. Serialized Collection
    2. List or Set Relationship
    3. Cascade Persist
    4. Relationship Owner
  2. Object-relational mapping and inheritance
    1. Object-Relational Mapping and Inheritance
  3. JPQL queries such as unexpected query results
    1. Query Result with Duplicates
    2. Null Parameter
    3. Navigation of Relationships
    4. UPDATE/DELETE and Persistence Context
    5. Query Flush Mode
  4. Runtime issues such as lost updates or performance issues
    1. Iteration / Sorting in Memory or in DB
    2. Lazy Loading of Relationships in a Loop
    3. EntityManager.merge Result
    4. EntityManager.persist and Transactions
    5. Merge DTO into Entity
    6. EntityManager.remove Does Not Remove Entity

We first start with a pitfall called: “Serialized Collection