Hibernate is a powerful, open-source Object-Relational Mapping (ORM) framework for Java, designed to simplify database interactions by mapping Java objects to relational database tables. Compatible with Java 17+ and Jakarta EE, Hibernate 6.6 (as of July 2025) offers a robust set of features for building scalable, maintainable applications. This guide outlines Hibernate's modern features, providing explanations, code examples, and context to help developers understand and apply them effectively.
Hibernate's core features provide the foundation for its ORM capabilities, enabling seamless interaction between Java objects and databases.
@Entity
public class User {
@Id
private Long id;
private String name;
public void setName(String name) { this.name = name; }
}
// In a session, changing 'name' triggers an automatic update
session.beginTransaction();
User user = session.find(User.class, 1L);
user.setName("New Name"); // Hibernate detects and persists the change
session.getTransaction().commit();
User user = session.find(User.class, 1L);
session.detach(user); // Detach from session
user.setName("Updated"); // Modify detached object
session.beginTransaction();
session.merge(user); // Reattach and persist changes
session.getTransaction().commit();
List<User> users = session.createQuery("FROM User WHERE name LIKE :name", User.class)
.setParameter("name", "John%")
.getResultList();
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root<User> root = query.from(User.class);
query.select(root).where(cb.like(root.get("name"), "John%"));
List<User> users = session.createQuery(query).getResultList();
List<User> users = session.createNativeQuery("SELECT * FROM users WHERE name LIKE :name", User.class)
.setParameter("name", "John%")
.getResultList();
Hibernate supports flexible mappings to define how Java objects correspond to database tables, with trade-offs to consider for each strategy.
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
public abstract class Vehicle { ... }
@Entity
@DiscriminatorValue("CAR")
public class Car extends Vehicle { ... }
@ElementCollection
private List<String> emails;
EntityGraph<User> graph = session.createEntityGraph(User.class);
graph.addAttributeNodes("orders");
session.find(User.class, 1L, Map.of("javax.persistence.fetchgraph", graph));
Hibernate simplifies primary key management with flexible strategies, balancing performance and portability.
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
}
@Entity
@IdClass(UserKey.class)
public class User {
@Id private String username;
@Id private String tenantId;
}
Hibernate supports multiple ways to define mappings, with annotations being the modern standard.
<property name="hibernate.hbm2ddl.auto" value="update"/>
Hibernate's caching improves performance by reducing database queries. Trade-off: Caching requires careful configuration to avoid stale data.
@Entity
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class User { ... }
Hibernate optimizes database interactions for scalability and efficiency.
@ManyToOne(fetch = FetchType.LAZY)
private Order order;
FROM User u LEFT JOIN FETCH u.orders
@Version
private int version;
Hibernate integrates seamlessly with modern Java ecosystems, enhancing developer productivity.
@PersistenceContext
private EntityManager em;
List<User> users = session.createQuery("FROM User", User.class)
.stream()
.filter(u -> u.getName().startsWith("John"))
.collect(Collectors.toList());
Hibernate offers advanced capabilities for complex applications.
@EntityListeners(AuditListener.class)
public class User { ... }
@Audited
public class User { ... }
@Where(clause = "deleted = false")
public class User { ... }
Hibernate integrates with enterprise Java ecosystems for robust application development.
Hibernate 6.6 is a versatile ORM framework that simplifies database interactions while offering advanced features for performance, scalability, and modern Java integration. Its support for flexible mappings, caching, and enterprise standards makes it ideal for a wide range of applications. For detailed guidance, refer to the Hibernate documentation.