Como criar relacionamentos complexos
21/02/2015 09:52
________________________
|Origem 1
_______________________|
|pK_o1|Desc 1 |
_______________________
|1 |Aaaaaaaaaaaaaaa |
_______________________
|2 |Bbbbbbbbbbbb |
________________________
________________________
|Origem 2
_______________________|
|pK_o1|Desc 2 |
_______________________
|1 |ccccccccccccc |
_______________________
|2 |Dddddddddddd |
________________________
________________________
|Origem N
_______________________|
|pK_o1|Desc N |
_______________________
|1 |Eeeeeeeeeeee |
_______________________
|2 |Ffffffffffff |
________________________
________________________
|Obj Relacionado
_______________________|
|pK_o1|Desc N |
_______________________
|1 |Ggggggggg |
_______________________
|2 |Hhhhhhhhhhhh |
________________________
|3 |Iiiiiiiiiiih |
________________________
___________________________________
|Relacionamento
___________________________________|
|ID_OBJ_REL| ID_OBJ_ORI | TIPO_ORI |
___________________________________
|1 |1 |Origem 1 |
___________________________________
|2 |1 |Origem 2 |
___________________________________
|3 |2 |Origem 1 |
___________________________________
|3 |2 |Origem N |
___________________________________
abstract class Origem {
static hasMany = [relacionados: Relacionado]
}
class Origem1 extends Origem {
String aaaaa
String bbbbb
}
//Idem para Origem2, Origem3, ..., OrigemN
Class Relacionado {
static hasMany = [origens: Origem]
static constraints = {
origens minSize: 1
}
}
class BaseEntity{
String name
static belongsTo = Incident
static hasMany = [incidents:Incident]
static constraints = {
}
static mapping = {
id generator: 'identity'
incidents joinTable: [name: "mm_incident_entity", key: 'mm_orige_id' ]
}
String toString(){
return this.name
}
}
class Classe1 extends BaseEntity{
String description
static belongsTo = Incident
static hasMany = [incidents:Incident]
static constraints = {
description size: 5..500
}
String toString(){
return this.name
}
}
class Classe2 extends BaseEntity{
String kind
static belongsTo = Incident
static hasMany = [incidents:Incident]
static constraints = {
kind inList:["val1", "val2", "val3"]
}
String toString(){
return this.name
}
}
class Incident {
String title
static hasMany = [origens:BaseEntity]
static constraints = {
origens minSize: 1
}
static mapping = {
id generator: 'identity'
origes:joinTable: [name: "mm_incident_entity", key: 'mm_incident_id' ]
}
String toString(){
return this.title
}
}
o Banco eu não sei como ficou porque ainda estou usando o temporário
tablePerHierarchy false
1) A classe BaseEntity não ficou abstract por que na hora de executar o generate-all, ela dava um porque em alguma parte criava um new BaseEntity o que não e possível de ser feito.
2)O resultado da View para incluir foi o que eu esperava, consegui cadastrar os dados relativos a origem, e no incidente ao cadastrar me lista todas elas certas, mas o problema e na hora de consultar porque o link aponta para uma view relativa ao BaseEntity e não a classe filha certa, mas acredito que é só estudar mais para acertar a view.
3) Como ficaram as classes
<classes>
static hasMany = [incidents:Incident]em Classe1 e Classe2 uma vez que ambas herdam o relacionamento de BaseEntity. Não sei nem qual vai ser o comportamento do grails nesse caso.
<g:link controller="BaseEntity" action="show" id="${o.id}">${o?.encodeAsHTML()}</g:link>
<g:if test="${o.instanceOf(classe1)}">
<g:link controller="classe1" action="show" id="${o.id}">${o?.encodeAsHTML()}</g:link>
</g:if>
<g:elseif test="${o.instanceOf(classe2)}">
<g:link controller="classe2" action="show" id="${o.id}">${o?.encodeAsHTML()}</g:link>
</g:elseif>
Para se registrar, clique aqui.