在GORM中如何在不使用连接表的情况下将输入的值存储在一对多关联中?

时间:2013-11-28 11:41:15

标签: grails gorm

这些是我的域类

class Parametro {  
String idParametro
String atributo 
String descripcion
String tipoParametro
String estadoParametro 

static hasMany =[valorParametro : ValorParametro]

static constraints = {        
    idParametro() 
    atributo()
    descripcion()
    tipoParametro inList: ['S','U']
    estadoParametro inList:['A','I']        
  }
  static mapping ={
   table 'parametros'
   version false
   id column:'id_parametro', generator:'assigned', name:'idParametro', type:'string'
   valorParametro column:'id_parametro',joinTable:false
   }
  }


class ValorParametro {

String idValorParametro
String idParametro
String valor
String orden
String estadoValorParametro

static belongsTo =Parametro

static constraints = {
    idValorParametro() 
    idParametro()
    valor()
    orden()
    estadoValorParametro inList:['A','I']   
}

static mapping = {
 table 'valor_parametros'  
 version false
 id generator:'assigned',name:'idValorParametro',column:'id_valor_parametro',type:'string'
 idParametro insertable:false
 idParametro updateable:false
}
}

这些表属于旧版MYsql DB

Create table parametros (

    id_parametro Varchar(10) NOT NULL,
tipo_parametro Char(1) COMMENT 'S=sistema U=Usuario',
atributo Varchar(50),
descripcion Varchar(100),
estado_parametro Char(1),
    Primary Key (id_parametro)) ENGINE = InnoDB;

Create table valor_parametros (
  id_valor_parametro Varchar(10) NOT NULL,
  id_parametro Varchar(10) NOT NULL,
  orden Varchar(5),
  valor Varchar(300),
  estado_valor_parametro Char(1),
      Primary Key (id_valor_parametro)) ENGINE = InnoDB;
Alter table valor_parametros add Foreign Key (id_parametro) references parametros  (id_parametro) on delete  restrict on update  restrict;

目标是:

1-)作为PK和FK的表和列的名称是自定义的

2-)主键和外键是字符串而不是生成(由用户在表单中输入)     在ValorParametro的Parametro(pk = IdParametro)中(pk = IdValorParametro,Fk = Id_parametro)

3-)通过foreing Key(不是Join表),关联是一对多(单向)     (参见JoinTable:false)

问题

与ValorParametro关联的表单中的

不保存FK的值(IdParametro) 正是因为选项idParametro可插入:false idParametro updateable:false

但如果删除它们,则会收到以下错误:

HTTP状态500 - 创建名为org.grails.internal.SESSION_FACTORY_HOLDER'的bean时出错:无法创建

的内部bean'(内部bean)'

输入[org.codehaus.groovy.grails.orm.hibernate.ConfigurableLocalSessionFactoryBean]而

设置bean属性'sessionFactory';嵌套异常是

org.springframework.beans.factory.BeanCreationException:创建名称为

的bean时出错

'(内部bean)#3':调用init方法失败;嵌套异常是

org.hibernate.MappingException:实体映射中的重复列:crm.ValorParametro

列:id_parametro(应使用insert =“false”update =“false”映射)

我可以做些什么来保存FK以实现目标?

该配置错误的映射?

1 个答案:

答案 0 :(得分:0)

这是因为Grails已经有一个名为id的域类属性,并且您声明了String idParametro。正确的做法是在所有域类中使用id,只需更改列名称:

class Parametro {  
  String id
  String atributo 
  String descripcion
  String tipoParametro
  String estadoParametro 

  static hasMany =[valorParametro : ValorParametro]

  ...

  static mapping = {
    //assigned means that you will set the id before saving new values.
    id column: 'id_parametro', generator: 'assigned'
  }

}

通过它,您将能够使用像Parametro.get("some id")这样的GORM方法。

然后,当您访问域类实例时,请始终使用id

Parametro par = new Parametro()
par.id = 'my key'