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>

🧠 Test Your Knowledge

Which annotation is used to mark a class as a Hibernate entity?