Grails 如何对多列使用唯一约束而不是创建复合键
我启动的新系统有几个域,它们只是多对多关系的连接表。它们都类似于SpringSecurityCore的示例。在Spring安全的情况下,映射的是一个“遗留”数据库,因此需要使用复合密钥 我的问题是,是否可以对字段的组合设置唯一约束,而不必使用复合键,从而实现get和其他函数。我很乐意使用id作为密钥,但我确实需要确保记录是唯一的 换句话说,如何在secUser+secRole上添加唯一约束,而不是在以下域中创建复合键Grails 如何对多列使用唯一约束而不是创建复合键,grails,many-to-many,constraints,unique-constraint,Grails,Many To Many,Constraints,Unique Constraint,我启动的新系统有几个域,它们只是多对多关系的连接表。它们都类似于SpringSecurityCore的示例。在Spring安全的情况下,映射的是一个“遗留”数据库,因此需要使用复合密钥 我的问题是,是否可以对字段的组合设置唯一约束,而不必使用复合键,从而实现get和其他函数。我很乐意使用id作为密钥,但我确实需要确保记录是唯一的 换句话说,如何在secUser+secRole上添加唯一约束,而不是在以下域中创建复合键 class SecUserSecRole implements Seriali
class SecUserSecRole implements Serializable {
SecUser secUser
SecRole secRole
boolean equals(other) {
if (!(other instanceof SecUserSecRole)) {
return false
}
other.secUser?.id == secUser?.id &&
other.secRole?.id == secRole?.id
}
int hashCode() {
def builder = new HashCodeBuilder()
if (secUser) builder.append(secUser.id)
if (secRole) builder.append(secRole.id)
builder.toHashCode()
}
static SecUserSecRole get(long secUserId, long secRoleId) {
find 'from SecUserSecRole where secUser.id=:secUserId and secRole.id=:secRoleId',
[secUserId: secUserId, secRoleId: secRoleId]
}
static SecUserSecRole create(SecUser secUser, SecRole secRole, boolean flush = false) {
new SecUserSecRole(secUser: secUser, secRole: secRole).save(flush: flush, insert: true)
}
static boolean remove(SecUser secUser, SecRole secRole, boolean flush = false) {
SecUserSecRole instance = SecUserSecRole.findBySecUserAndSecRole(secUser, secRole)
if (!instance) {
return false
}
instance.delete(flush: flush)
true
}
static void removeAll(SecUser secUser) {
executeUpdate 'DELETE FROM SecUserSecRole WHERE secUser=:secUser', [secUser: secUser]
}
static void removeAll(SecRole secRole) {
executeUpdate 'DELETE FROM SecUserSecRole WHERE secRole=:secRole', [secRole: secRole]
}
static mapping = {
id composite: ['secRole', 'secUser']
version false
}
}
如果允许添加一个新列作为真正的主键,则可以这样做,例如自动递增或基于序列的列。然后添加唯一约束将非常简单:
class SecUserSecRole {
SecUser secUser
SecRole secRole
static constraints = {
secUser(unique:'secRole')
}
}
但我怀疑这是一种选择:)
请注意,Grails 2.0支持Hibernate包,这解决了SecUserSecRole方法解决的收集性能问题。应该是secUser(唯一:'secRole')或secUser(唯一:['secRole'),对吗?