ColdFusion ORM 和默认构造函数(初始化方法)

ColdFusion ORM and default constructors (init method)

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

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

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

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

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

无论如何,是否还有其他解决该问题的方法?

编辑:

I filed a bug in the Adobe Bugbase.

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

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

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

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

constructor = ReflectHelper.getDefaultConstructor( mappedClass );

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

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

many efforts in making this request approved后,已修复

Nimit Sharma

5:08:05 AM GMT+00:00 Nov 20, 2015

This issue is fixed and the fix will be available as part of next major release of ColdFusion.

We have introduced a property "orminitmethod" at component level to address this issue. Subcomponent do not inherit orminitmethod. It behaves exactly like initmethod.

I have logged another tracking bug #4090267 to have an application level setting