我正在开发一个Grails应用程序,它将访问一个大型遗留数据库(将继续被其他旧版软件使用)。我创建了各种groovy类来模仿遗留数据库的域模型(因为它们从多个表中提取数据,因为grails / hibernate每个类只能执行一个表,所以它们不能是实际的grails域模型类。)
我现在正致力于将新表添加到数据库的应用程序的新部分,因此对于这些我可以使用实际的grails域模型类并让grails / hibernate做它的事情。我遇到的问题是我的实际grails域模型类需要将一些假装域模型类作为其属性。但是,hibernate失败了,因为它不知道如何处理这些假装域模型类。
我正在寻找有关如何从设计角度处理这种情况的建议。我能想到的一种方法是实际上不假装域模型类是grails域模型类的属性,而是存储某种可识别/重新创建伪装域模型类的唯一标识符。但是,我希望有一个更优雅的解决方案,或者如果没有一个,那么就可以自动化这个,这样就可以让它尽可能无缝。
非常感谢任何建议,想法等。
答案 0 :(得分:0)
如果你真的无法伪造域模型真实域模型,你可以选择将假装域模型类保存在真实域模型类中的transient
属性中,然后在Hibernate事件中手动管理这些类:
class RealDomain {
transient pretendDomain
def beforeValidate() { /* validate pretendDomain */ }
def beforeInsert() { /* save pretendDomain */ }
def beforeUpdate() { /* update pretentDomain */ }
// and so on
}
答案 1 :(得分:0)
您可以在域对象中放置一个瞬态列表,如下所示:
MyObject1 property1
MyObject2 property2
static transients = ['property1', 'property2', etc.]
答案 2 :(得分:0)
我最终使用自定义的hibernate类型来解决我的问题(http://grails.org/doc/2.3.x/guide/GORM.html#customHibernateTypes)。它们允许我自动化在域模型类中存储某种标识符的过程,以重新创建/重新加载假装域模型类。
答案 3 :(得分:0)
您还可以使用静态mapWith GORM属性描述非域类。此处更多信息:The Grails Framework - mapWith