为什么Hibernate不需要参数构造函数?

必须使用无参数构造函数(像Hibernate这样的工具会在此构造函数上使用反射来实例化对象)。


我得到了这个手挥手的答案,但是有人可以进一步解释吗?谢谢


陪伴而非守候
浏览 487回答 3
3回答

jeck猫

休眠,并且通常通过反射创建对象的代码Class<T>.newInstance()用于创建类的新实例。此方法需要一个公共的无参数构造函数才能实例化该对象。对于大多数用例,提供无参数构造函数不是问题。有一些基于序列化的技巧可以解决没有no-arg构造函数的问题,因为序列化使用jvm magic创建对象而无需调用构造函数。但这并非在所有VM上都可用。例如,XStream可以创建没有公共no-arg构造函数的对象实例,但只能通过在所谓的“增强”模式下运行,该模式仅在某些VM上可用。Hibernate的设计人员肯定会选择保持与所有VM的兼容性,因此避免了此类技巧,并使用了正式支持的反射方法Class<T>.newInstance(),该方法需要无参数的构造函数。

手掌心

呃,对不起大家,但是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以外的工具,要回答问题的“为什么”部分,答案是“绝对没有充分的理由”,而这由休眠拦截器的存在证明。那里有许多工具本来可以支持某种类似的机制来实现客户端对象实例化,但是它们不支持,因此它们自己创建对象,因此它们必须要求无参数的构造函数。我很容易相信这种情况的发生,因为这些工具的创建者将自己视为忍者系统程序员,他们创建了充满魔力的框架,供无知的应用程序程序员使用,他们(所以他们认为)永远不会在他们最疯狂的梦想中拥有需要诸如工厂模式这样的高级构造。(好的,这样想。我实际上并不这么认为。开玩笑。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java