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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top