Ehm, scusate tutti, ma Hibernate non richiede che le vostre classi debbano avere un costruttore senza parametri. La specifica JPA 2.0 lo richiede, e questo è molto noioso per conto di JPA. Anche altri framework come JAXB lo richiedono, il che è anche molto debole per conto di quei framework.
(In realtà, JAXB presumibilmente consente fabbriche di entità, ma insiste nell'istanziare queste fabbriche da solo, richiedendo loro di avere un costruttore senza parametri - indovina cosa - , che nel mio libro è esattamente buono come non consentire fabbriche; quanto è zoppo !)
Ma Hibernate non richiede una cosa del genere.
Hibernate supporta un meccanismo di intercettazione, (vedere "Interceptor" nella documentazione ,) che consente di istanziare i propri oggetti con qualsiasi parametro del costruttore di cui hanno bisogno.
Fondamentalmente, quello che fai è che quando configuri l'ibernazione gli passi un oggetto che implementa l' org.hibernate.Interceptor
interfaccia, e l'ibernazione invocerà il instantiate()
metodo di quell'interfaccia ogni volta che ha bisogno di una nuova istanza di un tuo oggetto, quindi la tua implementazione di quel metodo può new
i tuoi oggetti come preferisci.
L'ho fatto in un progetto e funziona come un fascino. In questo progetto faccio le cose tramite JPA quando possibile e utilizzo le funzionalità di Hibernate come l'interceptor solo quando non ho altre opzioni.
Hibernate sembra essere alquanto insicuro al riguardo, poiché durante l'avvio emette un messaggio informativo per ciascuna delle mie classi di entità, dicendomi INFO: HHH000182: No default (no-argument) constructor for class
e class must be instantiated by Interceptor
, ma poi in seguito le installo tramite l'interceptor, ed è felice di questo.
Per rispondere alla parte "perché" della domanda per strumenti diversi da Hibernate , la risposta è "assolutamente senza una buona ragione", e questo è dimostrato dall'esistenza dell'intercettore di ibernazione. Ci sono molti strumenti là fuori che avrebbero potuto supportare un meccanismo simile per l'istanziazione di oggetti client, ma non lo fanno, quindi creano gli oggetti da soli, quindi devono richiedere costruttori senza parametri. Sono tentato di credere che ciò stia accadendo perché i creatori di questi strumenti si considerano programmatori di sistemi ninja che creano framework pieni di magia per essere utilizzati da programmatori di applicazioni ignoranti, che (così pensano) non avrebbero mai nei loro sogni più sfrenati bisogno di costrutti così avanzati come ... Factory Pattern . (Va bene,pensare così. In realtà non la penso così. Sto scherzando.)
The no-argument constructor is a requirement
è sbagliata e tutte le risposte che procedono a spiegare perché è così senza chiedersi se sia effettivamente così (inclusa la risposta accettata, che ha persino ricevuto una taglia) sono sbagliate . Vedi questa risposta: stackoverflow.com/a/29433238/773113