Hibernate CRUD Operations

πŸš€ Step-by-Step Guide: CRUD Operations in Hibernate with H2

Now that we have set up Hibernate with H2, let’s implement CRUD (Create, Read, Update, Delete) operations for our Student Management Application.


πŸ”Ή Step 1: Create StudentDAO (Data Access Object)

We will use the DAO pattern to manage database operations.

πŸ“Œ Create StudentDAO.java

package com.example.dao;

import com.example.model.Student;
import com.example.util.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.Transaction;
import java.util.List;

public class StudentDAO {

    // CREATE - Add new student
    public void saveStudent(Student student) {
        Transaction transaction = null;
        try (Session session = HibernateUtil.getSessionFactory().openSession()) {
            transaction = session.beginTransaction();
            session.save(student);
            transaction.commit();
            System.out.println("Student saved: " + student);
        } catch (Exception e) {
            if (transaction != null) transaction.rollback();
            e.printStackTrace();
        }
    }

    // READ - Get a student by ID
    public Student getStudentById(int id) {
        try (Session session = HibernateUtil.getSessionFactory().openSession()) {
            return session.get(Student.class, id);
        }
    }

    // READ - Get all students
    public List<Student> getAllStudents() {
        try (Session session = HibernateUtil.getSessionFactory().openSession()) {
            return session.createQuery("from Student", Student.class).list();
        }
    }

    // UPDATE - Modify student details
    public void updateStudent(Student student) {
        Transaction transaction = null;
        try (Session session = HibernateUtil.getSessionFactory().openSession()) {
            transaction = session.beginTransaction();
            session.update(student);
            transaction.commit();
            System.out.println("Student updated: " + student);
        } catch (Exception e) {
            if (transaction != null) transaction.rollback();
            e.printStackTrace();
        }
    }

    // DELETE - Remove student by ID
    public void deleteStudent(int id) {
        Transaction transaction = null;
        try (Session session = HibernateUtil.getSessionFactory().openSession()) {
            transaction = session.beginTransaction();
            Student student = session.get(Student.class, id);
            if (student != null) {
                session.delete(student);
                System.out.println("Deleted student: " + student);
            }
            transaction.commit();
        } catch (Exception e) {
            if (transaction != null) transaction.rollback();
            e.printStackTrace();
        }
    }
}

βœ… What this DAO does:
βœ” saveStudent() β†’ Adds a new student to the database.
βœ” getStudentById() β†’ Fetches a student by ID.
βœ” getAllStudents() β†’ Retrieves all students from the database.
βœ” updateStudent() β†’ Modifies an existing student’s details.
βœ” deleteStudent() β†’ Removes a student by ID.


πŸ”Ή Step 2: Test CRUD Operations in Main.java

πŸ“Œ Modify Main.java to test CRUD operations

package com.example;

import com.example.dao.StudentDAO;
import com.example.model.Student;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        StudentDAO studentDAO = new StudentDAO();

        // CREATE - Add new students
        Student student1 = new Student("Alice", "Brown", "alice.brown@example.com");
        Student student2 = new Student("Bob", "Smith", "bob.smith@example.com");
        studentDAO.saveStudent(student1);
        studentDAO.saveStudent(student2);

        // READ - Fetch all students
        List<Student> students = studentDAO.getAllStudents();
        System.out.println("All Students: " + students);

        // READ - Get a student by ID
        Student fetchedStudent = studentDAO.getStudentById(1);
        System.out.println("Fetched Student: " + fetchedStudent);

        // UPDATE - Modify a student's details
        fetchedStudent.setEmail("alice.updated@example.com");
        studentDAO.updateStudent(fetchedStudent);

        // READ - Verify update
        Student updatedStudent = studentDAO.getStudentById(1);
        System.out.println("Updated Student: " + updatedStudent);

        // DELETE - Remove a student
        studentDAO.deleteStudent(2);

        // READ - Verify deletion
        List<Student> studentsAfterDelete = studentDAO.getAllStudents();
        System.out.println("Students after deletion: " + studentsAfterDelete);
    }
}

βœ… Expected Output

Hibernate: insert into students (email, first_name, last_name) values (?, ?, ?)
Hibernate: insert into students (email, first_name, last_name) values (?, ?, ?)
Student saved: Student{id=1, firstName='Alice', lastName='Brown', email='alice.brown@example.com'}
Student saved: Student{id=2, firstName='Bob', lastName='Smith', email='bob.smith@example.com'}
All Students: [Student{id=1, firstName='Alice', lastName='Brown', email='alice.brown@example.com'}, 
              Student{id=2, firstName='Bob', lastName='Smith', email='bob.smith@example.com'}]
Fetched Student: Student{id=1, firstName='Alice', lastName='Brown', email='alice.brown@example.com'}
Hibernate: update students set email=?, first_name=?, last_name=? where id=?
Student updated: Student{id=1, firstName='Alice', lastName='Brown', email='alice.updated@example.com'}
Updated Student: Student{id=1, firstName='Alice', lastName='Brown', email='alice.updated@example.com'}
Deleted student: Student{id=2, firstName='Bob', lastName='Smith', email='bob.smith@example.com'}
Students after deletion: [Student{id=1, firstName='Alice', lastName='Brown', email='alice.updated@example.com'}]

βœ… Summary

🎯 What We Implemented

βœ” Configured Hibernate with H2 in-memory database
βœ” Created a StudentDAO for CRUD operations
βœ” Implemented save, get, update, and delete operations
βœ” Tested CRUD operations step by step

πŸš€ Next Steps

Would you like to move forward with Hibernate Queries (HQL, Criteria API, and Native SQL)? πŸ˜ƒ