Quản lý giao dịch không phải một khái niệm của Hibernate. Nó là một khái niệm của cơ sở dữ liệu. Hibernate chỉ cung cấp các API để thực hiện nó mà thôi. Còn về lý do tại sao các hệ CSDL cần phải có giao dịch (transaction) và quản lý giao dịch thì bạn có thể tham khảo từ Internet. Lý do chính là để bảo đảm tính toàn vẹn dữ liệu (integrity). Ví dụ như khi bạn dùng CSDL để chứa các thông tin khi trả hoá đơn trên mạng, trong quá trình cập nhật mỗi một lần giao dịch (transaction), bạn phải cập nhật nhiều table khác nhau nhưng khi kết thúc quá trình đó, một trong các table không được cập nhật đúng. Nếu chỉ có 1 hoặc 2 record bị ảnh hưởng, bạn có thể điều chỉnh bằng tay. Nhưng nếu hệ CSDL của bạn quá lớn, điều này là không thể.Transaction management sẽ giúp bạn giải quyết vấn đề bằng cách rollback toàn bộ các record bị ảnh hưởng, vì vậy bảo đảm rằng CSDL của bạn không có các thông tin sai lệch. Hoặc khi một record được cập nhật cùng lúc bởi nhiều user (hay process) cùng lúc, transaction management sẽ bảo đảm rằng các thông tin sẽ được cập nhật một cách có kiểm soát bằng cách khoá (lock) nó lại.
Trong trường hợp này, tuỳ theo mã của bạn. Nếu mã của bạn chỉ đơn giản là truy vấn cơ sở dữ liệu mỗi lần page được reload thì dĩ nhiên mỗi lần như vậy, sẽ có một query được sinh ra và cơ sở dữ liệu sẽ phải chạy query đó và trả về kết quả. Nhưng nếu mã của bạn “thông minh” hơn để kiểm soát các sự kiện reload, thì bạn có thể dựa vào các thông tin từ client’s IP, cookies, thời gian giữa hai lần reload kế tiếp nhau từ cùng một browser để dùng thông tin từ server cache thay vì gởi về database chẳng hạn. Tuy nhiên, nếu cuối cùng yêu cầu của chương trình của bạn vẫn là phải gới các yêu cầu này đển CSDL thì bạn phải thiết kế hệ CSDL và hạ tầng sao cho nó có thể hoạt động đủ nhanh ngay cả khi phải thực hiện nhiều query đồng thời (bạn thử hình dung và tìm hiểu làm sao các CSDL Google hay Facebook có thể hoạt động với một số lớn các truy cập đồng thời - concurrent)
Bạn không cung cấp cách gọi và sử dụng đối tượng CustomerDAO
trong mã của bạn nên tôi không thể cho câu trả lời chính xác. Tuy nhiên, bạn nên chuyển các khai báo khởi tạo và kết thúc EntityManager và EntityManagerFactory trong CustomerDAO vào một lớp riêng. Theo nguyên tắc Single Responsiblity (trong SOLID), CustomerDAO chỉ nên tham chiếu (reference) đến EntityManager và EntityManagerFactory chứ không nên khởi tạo chúng. Nếu bạn làm tốt vấn đề này, nó có thể giải quyết câu hỏi của bạn. Và nếu tốt hơn nữa, bạn nên tham khảo cách sử dụng DI (Dependency Injection) khi tham chiếu đển các lớp phụ thuộc (trong trường hợp này là EntityManager và EntityManagerFactory).
Đây là một câu hỏi rất rộng. Có rất nhiều vấn đề liên quan đến Cache. Bạn không hiểu điều gì? Tương tự như khái niệm cache nói chung, cache trong Hibernate được dùng để giảm thiểu số truy cập trực tiếp vào CSDL, nhờ đó tăng hiệu năng và tốc độ (performance) của chương trình. Theo nguyên tắc chung về cache, thông tin sẽ được lưu và đọc từ cache cho đển khi có thay đổi và bắt buộc phải cập nhật CSDL. Để tăng tính hiệu quả và mềm déo, Hibernate cung cấp nhiều mức độ cache khác nhau (Cache Level).