Erm, desculpe a todos, mas o Hibernate não requer que suas classes tenham um construtor sem parâmetros. A especificação JPA 2.0 exige isso, e isso é muito ruim em nome do JPA. Outras estruturas, como JAXB, também exigem isso, o que também é muito ruim em nome dessas estruturas.
(Na verdade, JAXB supostamente permite fábricas de entidades, mas insiste em instanciar essas fábricas por si só, exigindo que elas tenham um construtor - adivinhe - sem parâmetros , que em meu livro é exatamente tão bom quanto não permitir fábricas; quão ruim é isso !)
Mas o Hibernate não exige tal coisa.
O Hibernate suporta um mecanismo de interceptação, (veja "Interceptor" na documentação ), que permite a você instanciar seus objetos com quaisquer parâmetros de construtor que eles precisem.
Basicamente, o que você faz é que quando você configura o hibernate você passa um objeto que implementa a org.hibernate.Interceptor
interface, e o hibernate irá então invocar o instantiate()
método daquela interface sempre que precisar de uma nova instância de um objeto seu, então a implementação desse método pode new
seus objetos da maneira que quiser.
Eu fiz isso em um projeto e funciona como um encanto. Neste projeto, faço as coisas via JPA sempre que possível e só uso recursos do Hibernate, como o interceptor, quando não tenho outra opção.
O Hibernate parece um tanto inseguro quanto a isso, já que durante a inicialização ele emite uma mensagem de informação para cada uma das minhas classes de entidade, dizendo-me INFO: HHH000182: No default (no-argument) constructor for class
e class must be instantiated by Interceptor
, mas depois eu as instancio por interceptor, e ele está feliz com isso.
Para responder ao "por que" parte da pergunta para outras ferramentas além do Hibernate , a resposta é "sem nenhuma boa razão", e isso é comprovado pela existência do interceptor do Hibernate. Existem muitas ferramentas por aí que poderiam oferecer suporte a algum mecanismo semelhante para a instanciação de objetos do cliente, mas não suportam, portanto, eles criam os objetos por si próprios, portanto, precisam exigir construtores sem parâmetros. Estou tentado a acreditar que isso está acontecendo porque os criadores dessas ferramentas pensam em si mesmos como programadores de sistemas ninja que criam frameworks cheios de magia para serem usados por programadores de aplicativos ignorantes, que (assim eles acham) nunca teriam em seus sonhos mais selvagens um necessidade de construções avançadas como o ... Padrão de fábrica . (OK,pensar assim. Eu realmente não penso assim. Estou brincando.)
The no-argument constructor is a requirement
está errada e todas as respostas que explicam por que isso é assim, sem questionar se é de fato assim, (incluindo a resposta aceita, que recebeu até recompensa) estão erradas . Veja esta resposta: stackoverflow.com/a/29433238/773113