Erm, xin lỗi mọi người, nhưng Hibernate không yêu cầu các lớp của bạn phải có một hàm tạo không tham số. Đặc tả JPA 2.0 yêu cầu nó, và điều này rất khập khiễng thay mặt cho JPA. Các khung công tác khác như JAXB cũng yêu cầu nó, điều này cũng rất khập khiễng thay cho các khung công tác đó.
(Trên thực tế, JAXB được cho là cho phép các nhà máy thực thể, nhưng nó khăng khăng đòi tự khởi tạo các nhà máy này, yêu cầu chúng phải có một phương thức khởi tạo không tham số - đoán xem - cái gì - trong cuốn sách của tôi chính xác là không cho phép các nhà máy; điều đó thật khập khiễng !)
Nhưng Hibernate không yêu cầu một điều như vậy.
Hibernate hỗ trợ cơ chế đánh chặn, (xem "Bộ đánh chặn" trong tài liệu ,) cho phép bạn khởi tạo đối tượng của mình với bất kỳ tham số phương thức khởi tạo nào mà chúng cần.
Về cơ bản, những gì bạn làm là khi bạn thiết lập chế độ ngủ đông, bạn chuyển cho nó một đối tượng triển khai org.hibernate.Interceptor
giao diện và ngủ đông sau đó sẽ gọi instantiate()
phương thức của giao diện đó bất cứ khi nào nó cần một phiên bản mới của một đối tượng của bạn, vì vậy việc triển khai phương thức đó của bạn có thể new
đồ vật của bạn theo bất kỳ cách nào bạn thích.
Tôi đã thực hiện nó trong một dự án và nó hoạt động như một cái duyên. Trong dự án này, tôi thực hiện mọi việc thông qua JPA bất cứ khi nào có thể và tôi chỉ sử dụng các tính năng Hibernate như bộ đánh chặn khi tôi không còn lựa chọn nào khác.
Hibernate dường như hơi không an toàn về nó, vì trong quá trình khởi động, nó đưa ra một thông báo thông tin cho từng lớp thực thể của tôi, cho tôi biết INFO: HHH000182: No default (no-argument) constructor for class
và class must be instantiated by Interceptor
, nhưng sau đó tôi thực hiện việc khởi tạo chúng bằng interceptor và tôi rất vui với điều đó.
Để trả lời phần "tại sao" của câu hỏi cho các công cụ không phải Hibernate , câu trả lời là "hoàn toàn không có lý do chính đáng", và điều này được chứng minh bằng sự tồn tại của công cụ đánh chặn ngủ đông. Có rất nhiều công cụ có thể đã hỗ trợ một số cơ chế tương tự cho việc khởi tạo đối tượng khách, nhưng chúng không hỗ trợ, vì vậy chúng tự tạo các đối tượng, vì vậy chúng phải yêu cầu các hàm tạo không tham số. Tôi bị cám dỗ để tin rằng điều này đang xảy ra bởi vì những người tạo ra những công cụ này nghĩ mình là những lập trình viên hệ thống ninja, những người tạo ra các khuôn khổ đầy ma thuật để được sử dụng bởi những lập trình viên ứng dụng ngu dốt, những người (vì vậy họ nghĩ) sẽ không bao giờ có cần các cấu trúc nâng cao như ... Mô hình Nhà máy . (Được chứ,nghĩ vậy. Tôi không thực sự nghĩ như vậy. Tôi đang đua ma.)
The no-argument constructor is a requirement
là sai và tất cả các câu trả lời giải thích lý do tại sao lại như vậy mà không đặt câu hỏi liệu điều này có thực sự như vậy hay không, (bao gồm cả câu trả lời được chấp nhận, thậm chí đã nhận được tiền thưởng) đều sai . Xem câu trả lời này: stackoverflow.com/a/29433238/773113