Erm, lo siento a todos, pero Hibernate no requiere que sus clases deban tener un constructor sin parámetros. La especificación JPA 2.0 requiere, y esto es muy poco convincente en nombre de JPA. Otros marcos como JAXB también lo requieren, lo que también es muy poco convincente en nombre de esos marcos.
(En realidad, JAXB supuestamente permite las fábricas de entidades, pero insiste en instanciar estas fábricas por sí misma, requiriendo que tengan un constructor sin parámetros , adivina qué , que en mi libro es exactamente tan bueno como no permitir fábricas; qué tonto es eso !)
Pero Hibernate no requiere tal cosa.
Hibernate soporta un mecanismo de interceptación (ver "Interceptor" en la documentación ) que le permite crear una instancia de sus objetos con cualquier parámetro de constructor que necesiten.
Básicamente, lo que haces es que cuando configuras hibernate le pasas un objeto que implementa la org.hibernate.Interceptor
interfaz, e hibernate invocará el instantiate()
método de esa interfaz cada vez que necesite una nueva instancia de un objeto tuyo, por lo que tu implementación de ese método puede new
sus objetos de la forma que desee.
Lo he hecho en un proyecto y funciona de maravilla. En este proyecto hago las cosas a través de JPA siempre que sea posible, y solo uso funciones de Hibernate como el interceptor cuando no tengo otra opción.
Hibernate parece estar algo inseguro al respecto, ya que durante el inicio emite un mensaje de información para cada una de mis clases de entidad, diciéndome INFO: HHH000182: No default (no-argument) constructor for class
yclass must be instantiated by Interceptor
, pero luego, más adelante, las instancia por interceptor, y está contento con eso.
Para responder a la parte del "por qué" de la pregunta para herramientas distintas de Hibernate , la respuesta es "sin ninguna buena razón", y esto está probado por la existencia del interceptor de hibernación. Hay muchas herramientas que podrían haber admitido algún mecanismo similar para la creación de instancias de objetos del cliente, pero no lo hacen, por lo que crean los objetos por sí mismos, por lo que deben requerir constructores sin parámetros. Me siento tentado a creer que esto está sucediendo porque los creadores de estas herramientas piensan en sí mismos como programadores de sistemas ninja que crean marcos llenos de magia para ser utilizados por programadores de aplicaciones ignorantes, quienes (eso creen) nunca en sus sueños más locos tendrían un necesidad de construcciones tan avanzadas como el ... Patrón de fábrica . (Bueno,pensar eso. En realidad, no lo creo. Estoy bromeando.)
The no-argument constructor is a requirement
es incorrecta , y todas las respuestas que proceden a explicar por qué esto es así, sin cuestionar si esto es así, (incluida la respuesta aceptada, que incluso ha recibido recompensa) son incorrectas . Vea esta respuesta: stackoverflow.com/a/29433238/773113