Hibernate ORM
Object-Relational Mapping made simple
🗃️ What is Hibernate?
Hibernate is a powerful Object-Relational Mapping (ORM) framework that maps Java objects to database tables. It eliminates boilerplate JDBC code and provides automatic SQL generation, caching, and transaction management.
// Simple Entity mapping
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "username")
private String username;
// getters and setters
}
Hibernate Features
ORM Mapping
Maps Java objects to database tables
@Entity
public class Product {
@Id
private Long id;
}
HQL
Hibernate Query Language
Query query = session.createQuery(
"FROM User WHERE age > :age");
query.setParameter("age", 18);
Caching
First and second level caching
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class User { }
Relationships
Handle entity relationships easily
@OneToMany(mappedBy = "user")
private List<Order> orders;
🔹 Basic Entity Example
Create a simple entity with Hibernate annotations:
@Entity
@Table(name = "employees")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "first_name", nullable = false, length = 50)
private String firstName;
@Column(name = "last_name", nullable = false, length = 50)
private String lastName;
@Column(name = "email", unique = true)
private String email;
@Column(name = "salary")
private BigDecimal salary;
@Temporal(TemporalType.DATE)
@Column(name = "hire_date")
private Date hireDate;
// Constructors, getters, and setters
public Employee() {}
public Employee(String firstName, String lastName, String email) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
}
// getters and setters...
}
Generated SQL:
CREATE TABLE employees (id BIGINT AUTO_INCREMENT, first_name VARCHAR(50), ...)
🔹 CRUD Operations
Perform database operations with Hibernate Session:
public class EmployeeDAO {
private SessionFactory sessionFactory;
// Create
public void saveEmployee(Employee employee) {
Session session = sessionFactory.getCurrentSession();
session.save(employee);
}
// Read
public Employee getEmployee(Long id) {
Session session = sessionFactory.getCurrentSession();
return session.get(Employee.class, id);
}
// Update
public void updateEmployee(Employee employee) {
Session session = sessionFactory.getCurrentSession();
session.update(employee);
}
// Delete
public void deleteEmployee(Long id) {
Session session = sessionFactory.getCurrentSession();
Employee employee = session.get(Employee.class, id);
if (employee != null) {
session.delete(employee);
}
}
// Find all
public List<Employee> getAllEmployees() {
Session session = sessionFactory.getCurrentSession();
return session.createQuery("FROM Employee", Employee.class).list();
}
}
🔹 Entity Relationships
Define relationships between entities:
// One-to-Many relationship
@Entity
public class Department {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "department", cascade = CascadeType.ALL)
private List<Employee> employees = new ArrayList<>();
}
@Entity
public class Employee {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "department_id")
private Department department;
}
// Many-to-Many relationship
@Entity
public class Student {
@Id
@GeneratedValue
private Long id;
@ManyToMany
@JoinTable(
name = "student_course",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "course_id")
)
private Set<Course> courses = new HashSet<>();
}
🔹 Hibernate Configuration
Configure Hibernate with hibernate.cfg.xml:
<!-- hibernate.cfg.xml -->
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">
com.mysql.cj.jdbc.Driver
</property>
<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306/mydb
</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.dialect">
org.hibernate.dialect.MySQL8Dialect
</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.show_sql">true</property>
<mapping class="com.example.Employee"/>
</session-factory>
</hibernate-configuration>