如何在grails中保存具有hasOne和belongsTo关系的对象

时间:2011-08-12 05:05:56

标签: hibernate grails

我定义了三个班级。

1)

class Office extends Organization {

   String name
   DistanceChart distanceChart 
   static constraints = {
      name(nullable : false)
      distanceChart(nullable:true)
   }
   static mapping = {
      officeRoles(cascade:'all')
   }

   public String toString() {
      name
   }
}

2)

class DistanceChart {
   VehicleClassification classification1
   VehicleClassification classification2
   VehicleClassification classification3
   VehicleClassification classification4
   VehicleClassification classification5
   List<PointDistanceMapping> pointDistanceMapping =new ArrayList<PointDistanceMapping>()

   static contraints ={
      classification1(nullable:true);
      classification2(nullable:true)
      classification3(nullable:true)
      classification4(nullable:true)
      classification5(nullable:true)
      pointDistanceMapping()
   }
   static belongsTo = [office:Office]
   static hasMany = [pointDistanceMapping : PointDistanceMapping]
   static mapping = {
      pointDistanceMapping cascade: "all"
   }
   public String toString() {
      id
   }   
}

第3)

class PointDistanceMapping {
   Point point
   float distance1
   float distance2
   float distance3
   float distance4
   float distance5

   static  constraints = {
      point()
      distance1(nullable:true)
      distance2(nullable:true)
      distance3(nullable:true)
      distance4(nullable:true)
      distance5(nullable:true)
   }
   static belongsTo = [distanceChart : DistanceChart]
   public String toString() {
      id
   }
}

我有两个疑问:

1)我是否需要在两个类中指定关系,即 hasOne或hasMany和belongsTo (双向)。所以定义的好习惯是什么grails中的关系。

2)我的第二个问题是 grails自动保存子对象。在这个上下文中。我将pointDistanceMapping对象作为数组,grails是否将pointDistanceMapping数组值保存到数据库中,并将在point_distance_mapping中设置设置外键distance_chart_id

当我保存DistanceChart对象时,grails是否在office表中设置distance_chart_id

如果grails没有保存关联对象意味着当我保存DistanceChart时,会保存pointdistancemapping。然后如何执行此操作。

当distanceChart被保存时,如何在office表中保存distance_chart_id。

1 个答案:

答案 0 :(得分:1)

  1. 您可以更方便地进行迭代。通常,如果您的代码不需要关系属性(YAGNI) - 请不要创建一个。如果集合非常大,请不要创建集合属性,最好使用动态findAll*()方法来处理关系。

  2. Grails级联由belongsTocascade mapping DSL控制:

    cascade - [...]可以是allmergesave-update,{{1}中的一个或多个(以逗号分隔) }},deletelockrefreshevictreplicate(仅限一对多关联)。 默认情况下,如果一个实体all-delete-orphan另一个实体{

  3. ,GORM会为all配置级联策略