Hibernate ColdFusion表单和默认构造函数(init方法)

Hibernate ColdFusion表单和默认构造函数(init方法),hibernate,orm,coldfusion,coldfusion-9,coldfusion-11,Hibernate,Orm,Coldfusion,Coldfusion 9,Coldfusion 11,Hibernate需要一个无参数构造函数,并且在所有支持方法重载的语言中,这可能不是问题,但是我在ColdFusion Form中遇到了一个非常恼人的问题(它依赖于Hibernate) 如果我为我的实体声明了一个自定义构造函数(init方法),并且该构造函数需要一些参数,Hibernate将无法对我的实体进行重新水化,因为它正在调用自定义构造函数 由于这种行为,设计总是有效的实体几乎是不可能的,因此CF-ORM几乎毫无用处 我找到的唯一解决方法是声明另一个自定义方法,我将其用作构造函数,使实例化

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

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

由于这种行为,设计总是有效的实体几乎是不可能的,因此CF-ORM几乎毫无用处

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

这一切中非常愚蠢的一点是,您可以使用
createObject
实例化一个实体,而无需调用
init
方法,因此我想知道为什么他们决定让Hibernate在实现中调用
init
方法,考虑到这一事实,它甚至不传递参数,然后通过其他方式设置它们

不管怎样,对于这个问题还有其他解决办法吗

编辑:


.

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


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

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

您可以将默认构造函数
设置为受保护的
,Hibernate将找到它,因为
PojoInstantiator
使用声明的构造函数:

constructor = ReflectHelper.getDefaultConstructor( mappedClass );
您可以定义一个构造函数来构造实体,而不是使用重载构造函数

通过这种方式,您可以强制客户机API只使用
Builder
,而不是默认构造函数。

之后,它已被修复

尼米特·夏尔马

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

此问题已修复,该修复将作为下一步的一部分提供 ColdFusion的主要发行版

我们在组件级别引入了一个属性“orminitmethod”来 解决这个问题。子组件不继承orminitmethod。信息技术 其行为与initmethod完全相同

我已经记录了另一个跟踪错误#4090267,以便有一个应用程序 水平设置


好的,始终有效的实体是域驱动设计(DDD)中的一个事实。我不想在不同的想法之间展开斗争,但允许无效的IMHO实体在带有ActiveRecord的简单CRUD域中可能没问题,但在DDD中没有位置。此外,我不认为有一个额外的映射抽象将如何帮助重新水化域实体?您仍然需要将新的面向持久性的实体映射到域对象。Hibernate在这里根本不是问题,问题来自于糟糕的ColdFusion实现,这非常令人沮丧。因为ORM似乎无法处理“始终有效的实体”,所以它“完全无用”?请解释一下。@ScottStroz好吧,如果你像我一样相信实体应该总是有效的,那么你就不允许在不强制不变量的情况下实例化你的类。例如,如果在我的域中,
Person
概念必须有一个
名称
,那么我不允许在没有名称的情况下实例化
Person
组件,但这样做会阻止我使用CF-ORM,因为在对对象重新水化时,
init
函数将在没有参数的情况下被调用。在构造函数可以重载的语言中,这不是一个问题。我不确定“再水化”对象是什么意思。您是说在持久化对象时,您需要传入将传入该对象属性的参数吗?如果是这样,您可以简单地使用类似于
newperson({firstName:'Bob',lastName:'Johnson'})的东西
。不过,我相信这是在CF10中引入的。您可以随时更新。@当hibernate从数据库加载数据并使用反射设置组件值时,会发生ScottStroz重新水化。使用CF-ORM,Hibernate将调用组件构造函数,就像调用无参数构造函数一样,因此它将失败。你能在CF10中尝试一下,看看它能带来什么吗?确保你的构造器参数是必需的。好吧……所以这不是我理解“再水化”的方式,但为了澄清,它导致了其他的混乱。为什么/如何使用
createObject()
newperson()
从数据库加载数据?我不确定这是在ColdFusion中从数据库检索实体数据的最佳方法。加载多个对象时,我倾向于使用
entityLoad()
,或者当我拥有特定实体的PK时,我倾向于使用多个条件或
entityLoadByPK()
。我唯一会使用
createObject()
newperson()
的时间是在创建新实例时。如果必须使用生成器,我想我更喜欢使用
new Object().constructor()
方法。为每个类使用构建器将是对模式的滥用。再一次,另一种观点认为ColdFusion是一种差劲的企业语言。。。