Ähm, entschuldigen Sie alle, aber Hibernate erfordert nicht , dass Ihre Klassen einen parameterlosen Konstruktor haben. Die JPA 2.0-Spezifikation erfordert dies, und dies ist im Namen von JPA sehr lahm. Andere Frameworks wie JAXB erfordern dies ebenfalls, was für diese Frameworks ebenfalls sehr lahm ist.
(Eigentlich erlaubt JAXB angeblich Entitätsfabriken, aber es besteht darauf, diese Fabriken selbst zu instanziieren, und erfordert, dass sie einen - erraten, was - parameterlosen Konstruktor haben , was in meinem Buch genauso gut ist, als Fabriken nicht zuzulassen; wie lahm ist das ? !)
Aber Hibernate erfordert so etwas nicht.
Der Ruhezustand unterstützt einen Abfangmechanismus (siehe "Abfangjäger" in der Dokumentation ), mit dem Sie Ihre Objekte mit den erforderlichen Konstruktorparametern instanziieren können.
Grundsätzlich übergeben Sie beim Einrichten des Ruhezustands ein Objekt, das die org.hibernate.Interceptor
Schnittstelle implementiert , und der Ruhezustand ruft dann die instantiate()
Methode dieser Schnittstelle auf, wenn eine neue Instanz eines Objekts von Ihnen benötigt wird, damit Sie diese Methode implementieren können new
Ihre Objekte, wie Sie möchten.
Ich habe es in einem Projekt gemacht und es funktioniert wie ein Zauber. In diesem Projekt mache ich Dinge über JPA, wann immer dies möglich ist, und ich verwende Hibernate-Funktionen wie den Interceptor nur, wenn ich keine andere Option habe.
Der Ruhezustand scheint etwas unsicher zu sein, da beim Start eine Infomeldung für jede meiner Entitätsklassen ausgegeben wird, die mir INFO: HHH000182: No default (no-argument) constructor for class
undclass must be instantiated by Interceptor
, aber später instanziiere ich sie per Interceptor, und das freut mich.
Um den "Warum" -Teil der Frage für andere Tools als "Ruhezustand" zu beantworten, lautet die Antwort "aus absolut keinem guten Grund", und dies wird durch die Existenz des Abfangjägers für den Ruhezustand bewiesen. Es gibt viele Tools, die einen ähnlichen Mechanismus für die Instanziierung von Clientobjekten hätten unterstützen können, aber dies ist nicht der Fall. Daher erstellen sie die Objekte selbst und benötigen daher parameterlose Konstruktoren. Ich bin versucht zu glauben, dass dies geschieht, weil die Entwickler dieser Tools sich selbst als Ninja-Systemprogrammierer betrachten, die Frameworks voller Magie erstellen, die von ignoranten Anwendungsprogrammierern verwendet werden, die (so denken sie) in ihren wildesten Träumen niemals eine haben würden Notwendigkeit für so fortschrittliche Konstrukte wie das ... Factory Pattern . (In Ordnung,so zu denken. Das glaube ich eigentlich nicht . Ich mache Witze.)
The no-argument constructor is a requirement
die falsch ist , und alle Antworten, die erklären, warum dies so ist, ohne zu hinterfragen, ob dies tatsächlich so ist (einschließlich der akzeptierten Antwort, die sogar Kopfgeld erhalten hat), sind falsch . Siehe diese Antwort: stackoverflow.com/a/29433238/773113