Ем, вибачте всіх, але Hibernate не вимагає, щоб ваші класи мали конструктор без параметрів. Специфікація JPA 2.0 вимагає цього, і це дуже кульгаво від імені JPA. Інші рамки, такі як JAXB, також вимагають цього, що також дуже кульгаво від імені цих фреймворків.
(Насправді, JAXB нібито дозволяє виробляти юридичні заводи, але він наполягає на створенні цих заводів самостійно, вимагаючи, щоб вони мали, - думаю, конструктор без параметрів , який у моїй книзі так само хороший, як не дозволяють заводам; наскільки кульга це !)
Але сплячого не вимагає такого.
Hibernate підтримує механізм перехоплення (див. "Перехоплювач" у документації ), який дозволяє створювати екземпляри об'єктів з будь-якими параметрами конструктора, які їм потрібні.
В основному, ви робите те, що при налаштуванні сплячого режиму ви передаєте йому об'єкт, що реалізує org.hibernate.Interceptor
інтерфейс, і в сплячку потім буде застосовуватися instantiate()
метод цього інтерфейсу, коли він потребує нового екземпляра вашого об'єкта, тому ваша реалізація цього методу може new
ваші предмети будь-яким способом вам подобається.
Я зробив це в проекті, і це працює як шарм. У цьому проекті я роблю речі через JPA, коли це можливо, і використовую такі функції Hibernate, як перехоплювач, лише коли у мене немає іншого варіанту.
Hibernate, здається, дещо невпевнений у цьому, оскільки під час запуску він видає інформаційне повідомлення для кожного з моїх класів сутності, повідомляючи мені INFO: HHH000182: No default (no-argument) constructor for class
і class must be instantiated by Interceptor
, але потім пізніше я створюю їх за допомогою перехоплювача, і це задоволено.
Щоб відповісти на частину запитання "чому" щодо інших інструментів, окрім сплячого режиму , відповідь "абсолютно без поважних причин", і це підтверджується існуванням перехоплювача сплячого режиму. Існує безліч інструментів, які могли б підтримувати якийсь подібний механізм створення клієнтських об’єктів, але вони цього не роблять, тому вони створюють об’єкти самостійно, тому їм потрібні конструктори без параметрів. Мені спокушається вірити, що це відбувається тому, що творці цих інструментів вважають себе програмістами системи ніндзя, які створюють рамки, наповнені магією, для використання необізнаними програмістами програм, які (так вони думають) ніколи в своїх найсміливіших мріях не мали потреба в таких вдосконалених конструкціях, як ... Заводський шаблон . (Добре,так думати. Я насправді так не думаю. Я жартую.)
The no-argument constructor is a requirement
невірно , і всі відповіді, які продовжують пояснювати, чому це так, не ставлячи під сумнів, чи це насправді так (включаючи прийняту відповідь, яка навіть отримала щедрість), є помилковими . Дивіться цю відповідь: stackoverflow.com/a/29433238/773113