2010-09-17 52 views
0

我想设置几个域类。我会用英文解释它,我想知道如何在grails中设置域名。大写字是我的域名grails中的变量声明与belongsTo关系相同吗?

员工有教育。雇员有许多雇主(过去和现在)。员工为每个雇主都有一个或多个项目。项目有一定的作用,客户端...等

现在的问题是,当例如,我定义的雇主,将我放

hasMany = [projects:Project] 

以及在项目投产

belongsTo = [employer:Employer, employee:Employee, client:Client] 

心灵你 - 许多员工可能在同一个项目上工作过,所以我可能想找出一种方法来定义这个项目?

会我也把雇主:

ArrayList<Project> project = new ArrayList(); 
    static hasMany = [projects:Project] 

或者是多余的?

回答

1

变量声明是而不是与定义belongsTo关系相同。 belongsTo通常与持久性操作的级联发挥作用,尤其是删除。举例来说,如果你有两类:如果一个特定的项目属于一个员工,而员工被删除,该项目将被删除

// Employee.groovy 
Project project 

// Project.groovy 
static belongsTo = Employee 

。这里的another SO question有一个很好的答案。

对于第二个问题,是的,定义List是多余的。如果你这样做:

static hasMany = [projects: Project] 

该集合是隐式定义的域。但是,在某些情况下,您可能需要初始化集合以便在constraints之内使用。有关更多详细信息,请参阅this issue

+0

你不必,只要将它定义为您所使用的地图符号。您可以简单地使用hasMany = [foos:Foo],然后将该声明用于约束。 – Gregg 2010-09-17 20:35:03

+0

从1.3开始是新的吗?我知道我至少在1.2.0中无法做到这一点。 – 2010-09-17 20:37:48

+0

可能是。自从我在代码的1.2.x分支中出现以来已经有一段时间了。 – Gregg 2010-09-17 20:41:52

1

这是多余的,但您的示例并不完全准确地描述您所描述的内容。默认情况下,当你定义一个hasMany时,Grails将创建一个Set。你的代码要做的是使用ArrayList而不是Set,但关系完全相同。我假设你的意思是你的项目ArrayList实际上是复数(项目s)。

而且,只是一个侧面说明,你应该总是使用接口declar你的类型变量,而不是一个实现:

List<Project> projects = new ArrayList<Project>() 
+0

+1,特别是关于接口类型的说明 – 2010-09-17 20:54:38

+0

只需要清楚这一点 - 关系将完全相同,但是由于我将项目定义为(对,你是对的,意味着它是“项目”),因为一个ArrayList,那么我将能够在这些对象上使用这些特殊的ArrayList方法,对吧? – Derek 2010-09-20 14:26:57