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