这些是我的域类
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以实现目标?
该配置错误的映射?
答案 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'