这最好用像Liquibase迁移工具来完成,而http://grails.org/plugin/database-migration插件可能是你最好是在Grails的,因为它使用Liquibase并与GORM紧密集成。但这个人很容易手工完成。
我不会用hasMany
因为你可以很容易地从ProjectMemberships
类管理一切,所以你Users
和Projects
类是
class Users {
String password
String firstName
String lastName
String emailAddress
String username
Company company
.....
}
和
class Projects {
String projectName
String description
Date dateCreated
Date lastUpdated
}
我会去用ProjectMemberships
类使用复合键,它需要它实现Serializable
并具有良好的hashCode
和equals
:
import org.apache.commons.lang.builder.HashCodeBuilder
class ProjectMemberships implements Serializable {
Users u
Projects p
boolean equals(other) {
if (!(other instanceof ProjectMemberships)) {
return false
}
other.u?.id == u?.id && other.p?.id == p?.id
}
int hashCode() {
def builder = new HashCodeBuilder()
if (u) builder.append(u.id)
if (p) builder.append(p.id)
builder.toHashCode()
}
static ProjectMemberships get(long userId, long projectId) {
find 'from ProjectMemberships where u.id=:userId and p.id=:projectId',
[userId: userId, projectId: projectId]
}
static ProjectMemberships create(Users u, Projects p, boolean flush = false) {
new ProjectMemberships(u: u, p: p).save(flush: flush, insert: true)
}
static boolean remove(Users u, Projects p, boolean flush = false) {
ProjectMemberships instance = ProjectMemberships.findByUsersAndProjects(u, p)
if (!instance) {
return false
}
instance.delete(flush: flush)
true
}
static void removeAll(Users u) {
executeUpdate 'DELETE FROM ProjectMemberships WHERE u=:u', [u: u]
}
static void removeAll(Projects p) {
executeUpdate 'DELETE FROM ProjectMemberships WHERE p=:p', [p: p]
}
static mapping = {
id composite: ['p', 'u']
version false
}
}
使用ProjectMemberships.create()
添加用户和项目之间的关系,并ProjectMemberships.remove()
将其删除。
运行grails schema-export
看到更新的DDL(它将在target/ddl.sql
)。运行project_memberships
表的创建表语句,例如
create table project_memberships (
p_id bigint not null,
u_id bigint not null,
primary key (p_id, u_id)
)
然后用这个SQL来填充它(取决于你的数据库,你可能需要一个稍微不同的语法):
insert into project_memberships(p_id, u_id) select id, project_lead_id from projects
终于从projects
表中删除project_lead_id
列。
当然在做任何改变之前做一个数据库备份。
你可以得到一个用户的项目
def projects = ProjectMemberships.findAllByUsers(user)*.p
,同样一个项目的用户
def users = ProjectMemberships.findAllByProjects(project)*.u
不知何故,我知道,这将是你从他们那里我会得到一个答案。非常感谢。 – Sap