Grails:domínio de classe (mapeamento de coleção de hibernação tipos de usuário)
-
26-09-2019 - |
Pergunta
Eu estou querendo saber se é possível implementar o seguinte modelo de domínio.
Vamos ter um domínio de classe que contém o conjunto de intervalos (joda time).Eu posso usar org.joda.em tempo.contrib.o hibernate.PersistentInterval hibernate tipo de usuário para o mapeamento do Intervalo de tabela de banco de dados (por semelhante modo como no http://www.grails.org/JodaTime+Plugin).No entanto eu não consigo descobrir como implementar o mapeamento se eu tiver conjunto de intervalos, não apenas como um intervalo.
Exemplo:
class Activity { ... Set intervals = [] ... static hasMany = [ intervals: org.joda.time.Interval ] // This is incorrect implementation, I have set of intervals // and this would be correct if I had only one interval // How to implement mapping in this case? static mapping = { intervals type: PersistentInterval, { column name: "start" column name: "end" } }
}
A implementação acima falhar com o seguinte erro:
2010-10-23 18:30:25,483 [principal] ERRO contexto.GrailsContextLoader - Erro execução de botas:Erro ao criar feijão com o nome 'messageSource':A inicialização do feijão de falha;aninhado exceção é org.springframework.feijão.fábrica.BeanCreationException:Erro ao criar o feijão com nome 'transactionManager':Não é possível resolver referência de feijão 'sessionFactory' durante a configuração de propriedade de feijão 'sessionFactory';aninhado exceção é org.springframework.feijão.fábrica.BeanCreationException:Erro ao criar o feijão com nome 'sessionFactory':Invocação de init método de falha;aninhado exceção é org.o hibernate.MappingException:Chave estrangeira (FK4FDC5B1E5107CA0:activity_intervals [start,end])) deve ter o mesmo número de colunas da chave primária referenciada (atividade [id]) org.springframework.feijão.fábrica.BeanCreationException:Erro ao criar o feijão com nome 'messageSource':Inicialização de feijão de falha;aninhado exceção é org.springframework.feijão.fábrica.BeanCreationException:Erro ao criar o feijão com nome 'transactionManager':Não é possível resolver referência de feijão 'sessionFactory' durante a configuração de propriedade de feijão 'sessionFactory';aninhado exceção é org.springframework.feijão.fábrica.BeanCreationException:Erro ao criar o feijão com nome 'sessionFactory':Invocação de init método de falha;aninhado exceção é org.o hibernate.MappingException:Chave estrangeira (FK4FDC5B1E5107CA0:activity_intervals [start,end])) deve ter o mesmo número de colunas da chave primária referenciada (atividade [id]) em org.grails.o tomcat.TomcatServer.iniciar(TomcatServer.groovy:212)
Eu pensei que o trabalho em torno esse problema é extrair Intervalo para separar domínio de classe que estende Intervalo e especificar o mapeamento de dentro dele.No entanto, o Intervalo é de classe final alargando assim não é possível.
Obrigado por seus conselhos.
Solução
Estou respondendo a minha própria pergunta, talvez esta resposta vai ser útil para alguém.
Até agora tenho encontrado apenas uma maneira de como implementar determinado modelo - por O Hibernate arquivos de mapeamento XML:
<hibernate-mapping package="mappingtest">
<class name="Activity">
<id name="id">
<generator class="native"/>
</id>
<set name="intervals">
<key column="activity_id" not-null="true"/>
<element type="org.joda.time.contrib.hibernate.PersistentInterval">
<column name="startDate"/>
<column name="endDate"/>
</element>
</set>
</class>
</hibernate-mapping>
de domínio e implementação de classe:
class Activity {
Long id
Set intervals = []
static constraints = {
}
}
Eu também tive que mover domínio de classe do grails-app/domain para src/groovy diretório, caso contrário, a aplicação em execução falhou com o (grails-1.3.5):
...
org.o hibernate.DuplicateMappingException:Duplicar classe/mapeamento de entidade mappingtest.Actividade
...
O segundo problema com a implementação acima que eu descobri é que quando eu liguei o andaime (para fins de teste) por:
class ActivityController {
static scaffold = true
...
}
mostrando de atividade criada falhou com o erro:
Mensagem De Exceção:Não essa propriedade:id de classe:org.joda.em tempo.Intervalo de Possíveis soluções:final Causados por:Erro de avaliação da expressão [eu.id] em linha [38]:Não essa propriedade:id classe:org.joda.em tempo.Intervalo Possível soluções:fim
mas o manual de implementação de obter actividades do banco de dados e mostrando a sua trabalhou.
Editar:além disso, eu encontrei solução de andaimes e DuplicateMappingException problemas.Eles foram causados por localização inválida de Activity.hbm.xml - pacote de estrutura de diretório foi falta.Local correto é grails-app/conf/hibernate/mappingtest/Activity.hbm.xml.