grails - 在 Grails 中使用一对多关系扩展域类

标签 grails grails-orm

这是扩展 Grails 父类和子类的正确方法吗?

最初我认为覆盖 hasMany 和belongsTo 属性是一个好主意,但效果不佳,因为它引入了相互冲突的功能,所以我从子类中删除了它。

我在这里尝试做的是打包多个应用程序之间的共享代码。我从插件中的这两个类开始。

class Purchase {
    String firstName
    String lastName

    static mapping = {
         tablePerHierarchy false
    }

    static hasMany = [items: PurchaseItem]
}

class PurchaseItem {
    BigDecimal price
    Integer qty

    statiuc belongsTo = [purchase: Purchase]

    static mapping = {
         tablePerHierarchy false
    }

}

特定于应用程序的类必须同时扩展 Purchase 和 PurchaseItem 所以我像这样实现它,继承一对多关系:
class Flight {

    static hasMany = [purchases: TicketPurchase]
}

class TicketPurchase extends Purchase {
    // some class specific properties

    static belongsTo = [flight: Flight]

}

class TicketPurchaseItem extends PurchaseItem 

    Integer bagQty

    static namedQueries = {
        ticketPurchaseItemsWithBagsByFlight {flightInstance->
            purchase {
                flight {
                    eq 'id', flightInstance.id
                }
            }
            gt 'bagQty', 0
        }
    }
}

TicketPurchaseItem 中的namedQuery 加入了Purchase 和Flight,即使父类(super class)Purchase 不属于Flight,只有子类TicketPurchase 有。
TicketPurchase ticketPurchase = new TicketPurchase()
ticketPurchase.addToItems(new TicketPurchaseItem(bagQty: 5)).save()

Flight flight = Flight.first()
flight.addToPurchases(ticketPurchase).save()

// this works
def ticketPurchaseItemList = TicketPurchaseItem.ticketPurchaseItemsWithBagsByFlight(flight)

这适用于 Grails,但它是好的设计还是有更好的方法来处理扩展一对多关系的域类?

最佳答案

简短的回答是你做对了。大概。要问的问题是您是否同意将添加到子类的属性设置为 NULL。我看不出你有什么问题。您可以从 Grails documentation 中了解有关 Grails 域类继承和多态查询的更多信息。来自我的博客 article就此主题而言。

如果您对域类模型对数据库的影响感到好奇,您可以通过记录来查看 GORM/Hibernate 正在运行的查询。我相信this是我用来设置日志记录的文章。

关于grails - 在 Grails 中使用一对多关系扩展域类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30743036/

相关文章:

grails - 如何在Grails中级联删除?

hibernate - 何时在 grails 中使用executeUpdate

chalice 3.3 : Is only the first save() persisted?

spring - grails 3 约束异常

grails - 使用 GORM 获取一对多加载对象的 ID,无需再次访问数据库

grails - 将Spring Security插件安装到Grails应用程序失败

grails - grails run-app返回 “context initialization failed”的奇怪情况

grails - Grails-Spring Security ldap事件目录身份验证-错误的凭证错误

hibernate - 潜在的 hibernate 版本问题:java.lang.NoSuchMethodError:org.hibernate.cfg.Configuration.setListener(Ljava/lang/String; Ljava/lang/Object;)

oracle - Grails - hasMany 太多了,需要限制 Oracle 中的 get() 结果