当前位置: 首页 > 面试题库 >

gorm save方法导致选择查询触发

商池暝
2023-03-14
问题内容

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

在会话2中单击保存时,我要保存实体。

因此,从我的作曲者/控制器中,我调用了一个服务方法(transactional),然后调用了person.save(),当我看到被触发的sql查询时,我看到了一个试图检索雇员对象的查询。

之后,保存被触发并引发nonuniqueobjectexception Exception

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]
  ......
}

这种行为正确吗?


问题答案:

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

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

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

编辑 我看不到为什么唯一约束会导致NonUniqueObjectException-您能否在没有约束的情况下尝试?

如果问题仍然存在,则必须在同一会话中两次保存对象-不知道它如何发生,也许是通过在较早的会话中merge()启用了对象Employee

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



 类似资料:
  • 问题内容: 我需要实现一个使用第一个查询参数来标识操作的Web服务,即客户端调用将类似于:或。 似乎我无法使用@Path注释来区分方法,因为区别特征在于查询参数。以下示例也引发了异常: 有没有一种方法可以根据查询参数指定要使用的方法?还是我真的必须定义一种方法并在其中检查是否设置了某些查询参数? 问题答案: 我认为Claudio是正确的-您可以使用Jersey,但是您将自己处理查询参数,因为它仅在

  • 问题内容: 我不了解这种情况下的行为。据我了解,带有无效子查询的查询应导致错误。但在此示例中,它返回一些行。 测试数据: 可以正常工作: 但是下面的查询也是在检索行,显然是通过从“ test_values”表中获取“ test_id2”列,而不是从子查询中所述的“ test_lookup”表中获取,尽管未在内部和外部使用别名部分。 问题答案: 原因是因为当子查询中不存在非别名列,但外部查询中确实存

  • 问题内容: 我想使用选择器使用cloudant db进行查询,例如下面所示:用户希望借入的借贷金额超过数字,如何在cloudant选择器中访问数组以查找特定记录 问题答案: 如果您使用默认的Cloudant Query索引(键入文本,对所有内容建立索引): 然后,以下查询选择器应可以查找例如所有借贷金额> 1000的文档: 我不确定您是否可以哄骗Cloudant查询仅索引数组中的嵌套字段,因此,如

  • 问题内容: 我有一个名为faq_questions的表,其结构如下: 我试图建立一个给定排序顺序的查询,选择具有最高排序顺序的行。 例子: 好的,假设我为已知的排序顺序(id 4)输入了5,我需要它返回ID为3的行。由于不能保证sort_order是连续的,所以我不能只选择known_sort_order + 1。 谢谢! 问题答案: 似乎太简单了,但是看起来像您所需要的:

  • 我正在尝试使用SupportSQLiteQueryBuilder生成RawQuery,它工作得很好,但是当我尝试添加用于生成WHERE条件的选择方法时,它就不起作用了。 从这里引用文档:https://developer . Android . com/reference/androidx/SQLite/db/SupportSQLiteQueryBuilder # selection(Java .

  • 问题内容: 我的SQL代码如下: 等效的linq表达式是什么? 问题答案: 我第一次尝试在 来源 LINQ to SQL中的NOT IN子句