Hibernate需要一个no-args构造函数,并且在支持方法重载的所有语言中都可能不是问题,但我在ColdFusion ORM中遇到了一个非常烦人的问题(它依赖于Hibernate罩)。
如果我为我的实体声明了一个自定义构造函数(一个init方法),并且该构造函数需要一些参数,那么Hibernate无法重新实现我的实体,因为它调用了自定义构造函数。
由于这种行为,似乎几乎不可能设计始终有效的实体,因此使CF-ORM接近完全无用。
我发现的唯一解决方法是声明另一个我用作构造函数的自定义方法,这使得实例化对象现在看起来像new SomeEntity().construct(...)
或createObject('component', 'SomeEntity').construct(...)
。这很麻烦......
在这一切中非常愚蠢的是你可以在不使用init
调用createObject
方法的情况下实例化实体,所以我想知道为什么他们决定让Hibernate调用{{1它们的实现方法,考虑到它甚至没有传递参数,然后通过其他方式设置它们。
无论如何,该问题还有其他解决方法吗?
编辑:
答案 0 :(得分:0)
始终有效的实体很少存在。因此,使用某种验证方法可能是您可以使用的路线之一。
或者您可以做的是继续拥有自己的对象,并仅在DAO层中使用ORM。但是,你会有另一组类似的课程,但是,这就是人们不喜欢ORM的原因。
答案 1 :(得分:0)
如果一个实体没有空构造函数,那么Hibernate在实例化实体时就不知道要提供什么参数。
您可以创建默认构造函数protected
,Hibernate会找到它,因为PojoInstantiator
使用声明的构造函数:
constructor = ReflectHelper.getDefaultConstructor( mappedClass );
您可以定义Builder来构造实体,而不是使用重载的构造函数。
这样,您可以强制说明客户端API只使用Builder
,而不是默认构造函数。
答案 2 :(得分:0)
在many efforts in making this request approved之后,它已被修复。
Nimit Sharma
格林威治标准时间上午5:08:05 + 2015年11月20日00:00
此问题已修复,修复程序将作为下一部分的一部分提供 ColdFusion的主要版本。
我们引入了一个属性" orminitmethod"在组件级别 解决这个问题。子组件不继承orminit方法。它 表现完全像initmethod。
我已经记录了另一个跟踪错误#4090267以获得一个应用程序 等级设置