4

Hibernate 需要一个无参数的构造函数,并且在所有支持方法重载的语言中,这可能不是问题,但我在 ColdFusion ORM 中遇到了一个非常烦人的问题(它依赖于 Hibernate)。

如果我为我的实体声明了一个自定义构造函数(一个 init 方法)并且该构造函数需要一些参数,那么 Hibernate 无法重新水合我的实体,因为它正在调用自定义构造函数。

由于这种行为,设计始终有效的实体似乎几乎是不可能的,因此使 CF-ORM 几乎完全无用。

我发现的唯一解决方法是声明另一个我用作构造函数的自定义方法,它使实例化对象现在看起来像new SomeEntity().construct(...)or createObject('component', 'SomeEntity').construct(...)。真是太麻烦了……

在这一切中非常愚蠢的是你可以在不调用init方法的情况下实例化一个实体 using createObject,所以我想知道为什么他们决定让 Hibernateinit在他们的实现中调用该方法,考虑到它甚至没有传递参数并在之后由其他设置它们方法。

无论如何,对于这个问题还有其他解决方法吗?

编辑:

我在 Adob​​e Bugbase 中提交了一个错误

4

3 回答 3

0

始终有效的实体很少存在。因此,拥有某种验证方法可能是您可以采用的方法之一。

或者你能做的就是继续保持你自己的对象,只在DAO层使用ORM。但是,您将拥有另一组类似的类,但是是的,这就是人们不喜欢 ORM 的原因。

于 2015-02-01T21:39:21.260 回答
0

如果实体没有空的构造函数,那么 Hibernate 将不知道在实例化实体时要提供哪些参数。

您可以创建默认构造函数protected,Hibernate 会找到它,因为PojoInstantiator使用声明的构造函数:

constructor = ReflectHelper.getDefaultConstructor( mappedClass );

您可以定义一个Builder来构造实体,而不是使用重载的构造函数。

这样,您可以强制Builder您的客户端 API 只使用 ,而不是默认构造函数。

于 2015-03-14T16:56:39.560 回答
0

经过多次努力使此请求获得批准,它已得到修复。

尼米特·夏尔马

格林威治标准时间上午 5:08:05+2015 年 11 月 20 日 00:00

此问题已修复,该修复将作为 ColdFusion 的下一个主要版本的一部分提供。

我们在组件级别引入了一个属性“orminitmethod”来解决这个问题。子组件不继承 orminit 方法。它的行为与 initmethod 完全相同。

我记录了另一个跟踪错误 #4090267 以进行应用程序级别设置

于 2016-09-16T01:30:43.117 回答