2013-04-16 9 views
6

Sto tentando di utilizzare un dominio incorporato con una relazione molti-a-uno in Grails 2.2.1. Ecco una versione semplificata di ciò che sto cercando di fare.Composizione GORM - dominio incorporato con relazione molti-a-uno getta org.hibernate.MappingException

sto mappatura di tabelle db esistenti:

create table incident (id bigint generated by default as identity, state_id bigint not null, primary key (id)); 
create table state (id bigint generated by default as identity, name varchar(255) not null, primary key (id)); 
alter table incident add constraint FK52F44D27499E79E foreign key (state_id) references state; 

Domini che mappano a "incidente" tavolo:

class Incident { 
    Vehicle vehicle 
    static embedded = ['vehicle'] 
} 

class Vehicle{ 
    State state 
    static mapping = { 
     state column: 'state_id' 
    } 
} 

dominio che mappa "stato" tavolo:

class State { 
    String name 
} 

Quando provo a eseguire la mia applicazione, ottengo il seguente errore:

Message: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.MappingException: Could not determine type for: test.State, at table: incident, for columns: [org.hibernate.mapping.Column(vehicle_state)]

È possibile avere un'associazione many-to-one all'interno di un dominio incorporato?

- Aggiornamento -

ho finito per usare una soluzione per ottenere lo stato.

class Vehicle{ 

    static transients = [ "state" ] 

    Long stateId 

    static mapping = { 
     stateId column: 'state_id' 
    } 

    State getState(){ 
     State.get(this.stateId) 
    } 
} 
+0

sto iniziando a pensare che questo potrebbe essere un bug graal ... suoni simili a http: //jira.grails.org/browse/GRAILS-9012 –

risposta

4

Come di Grails 2.2.1, classi di dominio incorporati hanno diversi problemi di usabilità che li rendono difficili da lavorare, soprattutto nei database legacy.

  1. relazioni non funzionano
  2. mappature colonna personalizzata non funzionano

È meglio mappare la colonna direttamente nella classe proprietaria, quindi la creazione di un metodo di supporto per affrontare i soggetti incorporati .

es .:

// grails-app/domain/yourpkg/Incident.groovy 
class Incident { 
    State state 

    public Vehicle getVehicleData() { 
     return new Vehicle(state: state) 
    } 

    public void updateWithVehicle(Vehicle vehicle) { 
     state = vehicle.state 
    } 

    static mapping = { 
     state column: 'state_id' 
    } 
} 

// src/groovy/yourpkg/Vehicle.groovy 
class Vehicle { 
    State state 
} 
+0

Sono andato con una soluzione simile al tuo suggerimento e ho aggiunto un metodo di supporto per ottenere lo stato. Sono assolutamente d'accordo con voi su problemi di usabilità con classi di dominio embedded - si spera che questo sarà affrontato nelle versioni future di Grails! :) –

0

In questo caso i domini devono essere serialized (compreso il incorporato Vehicle che non sarà parte della persistenza se trasferito a src/groovy) e generare equals()hashCode() per le classi. Vecchia scuola ma funziona bene, l'app funziona in modo appropriato.

Incedent.groovy

import groovy.transform.EqualsAndHashCode 

@EqualsAndHashCode 
class Incedent implements Serializable{ 
    Vehicle vehicle 
    static embedded = ['vehicle'] 

    class Vehicle{ 
     State state 
    } 
} 

State.groovy

import groovy.transform.EqualsAndHashCode 

@EqualsAndHashCode 
class State implements Serializable { 
    String name 
} 

seguito di quanto sopra si otterrebbe una colonna Incedent per l'incorporamento con un tipo di dati di VARBINARY (durante il test con in memoria H2 db). Io preferirei avere il stateName come stringa nel Vehicle

enter image description here

+0

Ho provato, ma la struttura della tabella non sembra essere corretta. Sfortunatamente, sto lavorando con un db esistente, quindi non posso cambiare le tabelle. Ho aggiunto il ddl per il mio db alla domanda - si spera che ciò lo renda un po 'più chiaro. –

Problemi correlati