【问题标题】:Grails (Hibernate) does select before insert without passing id argument valueGrails(Hibernate)在插入之前选择而不传递 id 参数值
【发布时间】:2011-08-28 09:10:24
【问题描述】:

我开始对我的 grails web 应用程序进行更严格的测试,是时候从 hsqldb 迁移到 postgres。一切都或多或少没问题,但是在创建测试数据时我在 Bootstrap 中遇到错误。 Hibernate 尝试在将行插入数据库之前进行选择。 不幸的是,这样做时它不会将参数传递给选择,并且我收到异常说未指定参数 1 值。

这是我的域类:

class User {

static constraints = {
    deviceId(
            blank: false,
            unique: true,
    )
    userName(nullable: true, size: 5..15, blank: false, unique: true)
    password(nullable: true, size: 5..15, blank: false)
    email(nullable: true, email: true, blank: false, unique: true)
    blockedUsers(unique: true)
}
static mapping = {
    table "player"
    deviceId indexColumn: [name: "deviceId", unique: true]
}
static mappedBy = [inbox: 'userTo', outbox: 'userFrom']
static hasMany = [profiles: Profile, inbox: Message, outbox: Message, blockedUsers: User]

List<User> blockedUsers = new ArrayList<User>()
String deviceId
String userName
String email
String password
Boolean readyForExport = false
Boolean newUser = false
[...]
}

所以没有什么特别之处。 在此错误之前,我在其他域上有很多 .save(flush:true) 命令,一切都很好。正是这个引发了错误:/

这些是导致此错误的行。

User userA = new User(userName: "test", password: "dkjughey3htg", email: "integration@test.com", deviceId: 'intTestDevice')
userA.save(flush:true)

任何提示为什么会发生这种情况?

【问题讨论】:

    标签: hibernate postgresql grails grails-orm


    【解决方案1】:

    我没有对此进行测试,但我认为您的问题出在:

    blockedUsers(unique:true)
    

    您将blockedUsers 指定为List 而不是GORM 的默认Set 是否有原因?使用 Set,成员的唯一性是自动的,然后您不必使用唯一约束,这在一对多属性上可能无法正常工作。另外,这不相关,但明文密码很顽皮。

    【讨论】:

    • 嗨,乔丹。你是对的,这个约束是阻止引导程序执行的原因...... list 给了我一些 set 没有的东西 - 正确的顺序。在这种情况下不需要它,但是这样做可能是因为在其他几个地方我们需要正确的顺序,并且使用列表而不是其他方式更容易实现它。是的......明文密码很顽皮,购买我更喜欢实施 Spring Security 作为公开测试之前的最后一步,因为它对 grails 启动有时间影响;)再次感谢!
    • 酷。如果你想使用一个列表,你可以做一个自定义约束来测试唯一性,而不是内置的唯一约束。
    猜你喜欢
    • 2019-06-14
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多