首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Grails域更新与数据库触发器更新

Grails域更新与数据库触发器更新
EN

Stack Overflow用户
提问于 2016-05-15 14:13:47
回答 1查看 526关注 0票数 1

我有两个表,第一个是父表,第二个是子表。

代码语言:javascript
复制
Table Employee:
Emp_Id, Name, Age, Salary, Travel_Allowance, Cost_To_Company

Table Allowance:
Id, Emp_Id, Type, Amount

在这里,每当为Allowance表中的Travel_Allowance类型记录插入/更新行时,我都需要更新Employee表的Travel_Allowance列。

为此,我在Allowance表上编写了一个触发器,每当对Travel_Allowance类型的record执行insert/update操作时,都会更新Employee表的Travel_Allowance列。

触发器:

代码语言:javascript
复制
CREATE TRIGGER [trig_updateEmployeeOnAllowanceUpsert]
ON [Allowance]
FOR INSERT,UPDATE
AS

UPDATE Employee SET Travel_Allowance = i.amount
FROM Employee e 
INNER JOIN INSERTED i ON e.emp_id = i.emp_id
AND i.type = 'TravelAllowance';

在Grails中,我的代码如下:

代码语言:javascript
复制
class Employee {
    String name
    Integer age
    BigDecimal salary
    BigDecimal travelAllowance
    BigDecimal costToCompany
    static hasMany = [allowances: Allowance]
}

class Allowance {
    Employee employee
    BigDecimal amount

    static belongsTo = [employee: Employee]
}

A)准备津贴对象并将其添加到Employee对象,如-

代码语言:javascript
复制
def updateAllowances(def employeeId, def allowanceAmount) {
    Employee emp = Employee.get(employeeId)
    Allowance a = new Allowance()
    a.employee = emp
    a.amount = allowanceAmount
    emp.addToAllowances(a)

    // Calculate Cost To Company
    def newCost = 0
    emp.alowances.each { allowance ->
        newCost += allowance.amount
    }
    emp.costToCompany = newCost + emp.salary;
    emp.save(flush:true, failOnError: true)
}

当更新现有的Travel_Allowance类型记录时,上面的代码工作正常。但是,虽然添加了新的Travel_Allowance类型记录,但这并不像预期的那样工作。

在添加新的Travel_Allowance类型记录时,触发器正在使用新的津贴记录金额更新Employee表。然后Grails用Travel_allowance列中的上一个值覆盖相同的记录。

如何使Grails不覆盖从数据库触发器更新的值?

EN

回答 1

Stack Overflow用户

发布于 2016-05-17 01:34:06

好吧,我认为你可以使用Grails的派生属性来解决这个问题。派生属性基本上是一个SQL计算字段。因此,您可以将travelAllowance设置为一个派生属性,它只返回Travel_Allowance SQL列:

代码语言:javascript
复制
class Employee {
    String name
    Integer age
    BigDecimal salary
    BigDecimal travelAllowance
    BigDecimal costToCompany
    static hasMany = [allowances: Allowance]

    static mapping = {
        travelAllowance formula: 'Travel_Allowance'
    }
}

这将告诉GORM/Hibernate将Employee.travelAllowance设置为只读,这意味着它不会持久化对属性的更改。相反,它总是简单地从表中读取值,因此,当您保存Employee实例时,它不会覆盖该值。这意味着触发器将通过Allowance实例完全负责维护该值。

您可能已经有了travelAllowance的映射,因为您的表模式与Grails期望的不匹配。也许是这样的?

代码语言:javascript
复制
static mapping = {
    travelAllowance column: "Travel_Allowance"
}

如果是这样,只需像我的示例中那样进行更改。

警告

travelAllowance更改为派生属性的一个副作用是,在执行模式创建/更新时,Grails不会为您生成该表列。就Grails而言,该列并不存在。一些需要牢记的事情。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37235154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档