呃,对不起大家,但是Hibernate并没有要求你的类必须有一个参数的构造函数。JPA 2.0规范对此有要求,对于JPA而言,这是非常la脚的。其他框架(如JAXB)也需要它,对于那些框架而言,这也非常la脚。(实际上,JAXB应该允许实体工厂,但是它坚持要自行实例化这些工厂,要求它们具有--guess what--less parameterless构造函数,在我的书中这与不允许工厂一样好;这真是la脚。 !)但是Hibernate不需要这样的东西。Hibernate支持一种拦截机制(请参阅文档中的“ Interceptor”),该机制使您可以使用所需的构造函数参数实例化对象。基本上,您要做的就是在设置休眠状态时将其传递给实现org.hibernate.Interceptor接口的对象,然后休眠状态将instantiate()在需要它的新实例时调用该接口的方法,因此您可以实现该方法new以您喜欢的任何方式来处理您的对象。我已经在一个项目中做到了,它就像一个魅力。在这个项目中,我会尽可能通过JPA进行操作,并且在没有其他选择时,我只会使用Hibernate功能(例如拦截器)。Hibernate似乎对此不太安全,因为在启动过程中它为我的每个实体类发出一条信息消息,告诉我INFO: HHH000182: No default (no-argument) constructor for class和class must be instantiated by Interceptor,但是后来我确实通过拦截器实例化了它们,对此感到满意。对于Hibernate以外的工具,要回答问题的“为什么”部分,答案是“绝对没有充分的理由”,而这由休眠拦截器的存在证明。那里有许多工具本来可以支持某种类似的机制来实现客户端对象实例化,但是它们不支持,因此它们自己创建对象,因此它们必须要求无参数的构造函数。我很容易相信这种情况的发生,因为这些工具的创建者将自己视为忍者系统程序员,他们创建了充满魔力的框架,供无知的应用程序程序员使用,他们(所以他们认为)永远不会在他们最疯狂的梦想中拥有需要诸如工厂模式这样的高级构造。(好的,这样想。我实际上并不这么认为。开玩笑。)