【问题标题】:gorm save method causing a select query to firegorm save 方法导致选择查询触发
【发布时间】:2011-08-24 16:24:05
【问题描述】:

我正在使用 grails 1.3.7 和 zkoss,我的域模型如下,我在会话 1 中加载 Person 实体并通过 UI 对其进行更改。

在会话 2 中按保存我想保存实体。

所以从我的作曲家/控制器中,我调用了一个服务方法(事务性),然后执行 person.save(),当我看到 sql 查询被触发时,我看到一个尝试检索员工对象的查询。

之后触发保存并抛出非唯一对象异常 例外

org.hibernate.NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联:[com.nthdimenzion.domain.Employee#2]

查询

Hibernate: select this_.id as id7_0_, this_.version as version7_0_, this_.emp_id as emp4_7_0_, this_.person_id as person5_7_0_ from person_role this_ where this_.class='com.nthdimenzion.domain.Employee' and this_.emp_id=?

class PersonService {
static transactional = true
def savePerson(Person person) {
    person = person.save();
}

}

class Person extends Party{

String firstName;
String middleName;  
static hasMany = [ personRoles : PersonRole ] -- lazy loaded

.... }

class PersonRole {
public static enum ROLETYPES{
    EMPLOYEE,AUTHOR
};
public boolean hasRoleType (ROLETYPES roleType){
    return false;
}
static transients = ['ROLETYPES']
static constraints = {
}
 }



class Employee extends PersonRole{
def empRoleType = [ROLETYPES.EMPLOYEE]
String empId
    static belongsTo = [person:Person]
 static transients = ['empRoleType', 'uid']
static constraints = {
    books(nullable:true)
    empId(unique:true)
}
static hasMany = [books:Book]
static mapping = { books cascade:"all" }
static belongsTo = [person:Person]
  ......
}

这种行为正确吗?

【问题讨论】:

    标签: hibernate grails grails-orm


    【解决方案1】:

    您必须在 Employee 映射中指定 empId 是主键 - 这可能是 NonUniqueObjectException 的唯一原因。

    SQL 查询必须来自 empId 字段的唯一约束。

    为什么不使用 Grails'/Hibernate 隐式 id,您使用的是具有特定映射的旧数据库吗?

    编辑我不明白为什么唯一约束会导致NonUniqueObjectException - 你能在没有约束的情况下试试吗?

    如果问题仍然存在,您必须在同一个会话中保存了两次该对象 - 不知道它是如何发生的,可能是通过 merge()-ing 来自早期会话的 Employee

    SQL 查询是由唯一性约束引起的,这是正确的。

    【讨论】:

    • 不,我没有仔细检查这个!我的员工创建表如下CREATE TABLE employee (id BIGINT(20) NOT NULL AUTO_INCREMENT, version BIGINT(20) NOT NULL, emp_id VARCHAR(255) NOT NULL,
    • Employee 类是否有 static mapping 字段或 static constraints?还是您使用 Hibernate 注释或 XML 配置?
    • 它同时具有静态映射和静态约束,更新了我的问题以显示静态映射和约束
    • 我很惊讶,如果我删除唯一性约束,它会完美运行!为什么唯一性约束会导致选择查询触发?
    • 只是因为需要检查。在发出INSERT 之前,您需要检查您是否违反了任何约束。我想知道如果存在数据库唯一约束,为什么不 Hibernate 处理 SqlException/NonUniqueObjectException - 但它就是这样工作的。
    猜你喜欢
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    相关资源
    最近更新 更多