2013-04-16 2 views
6

Ich versuche, eine eingebettete Domäne mit einer Viele-zu-eins-Beziehung in Grails 2.2.1 zu verwenden. Hier ist eine vereinfachte Version von dem, was ich versuche zu tun.GORM-Zusammensetzung - eingebettete Domäne mit Viele-zu-eine-Beziehung wirft org.hibernate.MappingException

Ich Mapping auf bestehende db Tabellen:

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; 

Domains, die auf "Vorfall" Tabelle Karte:

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

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

Domain, die auf "Zustand" Tabelle ordnet:

class State { 
    String name 
} 
Wenn ich versuche, meine Anwendung auszuführen, erhalte ich die folgende Fehlermeldung:

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)]

Ist es möglich, eine Viele-zu-Eins-Assoziation innerhalb einer eingebetteten Domäne zu haben?

- aktualisieren -

landete ich eine Abhilfe mit dem Zustand zu erhalten.

class Vehicle{ 

    static transients = [ "state" ] 

    Long stateId 

    static mapping = { 
     stateId column: 'state_id' 
    } 

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

Ich fange an, dies zu denken, könnte ein grails bug ... Klingt http ähnlich: //jira.grails.org/browse/GRAILS-9012 –

Antwort

4

Ab Grails 2.2.1, eingebettet Domain-Klassen haben verschiedene Usability-Probleme hat, die sie nur schwer zu arbeiten, vor allem in Legacy-Datenbanken zu machen.

  1. Beziehungen funktionieren nicht
  2. Benutzerdefinierte Spaltenzuordnungen nicht

arbeiten Du bist besser dran die Abbildung der Spalte direkt in der besitzenden Klasse, dann eine Hilfsmethode zu schaffen mit den eingebetteten Einheiten zu beschäftigen .

z.B .:

// 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

Ich ging mit einer Problemumgehung ähnlich Ihrem Vorschlag und fügte eine Hilfsmethode hinzu, um den Status zu erhalten. Ich stimme definitiv mit Ihnen über Usability-Probleme w/Embedded-Domain-Klassen - hoffentlich wird dies in zukünftigen Grails-Releases angesprochen werden! :) –

0

In diesem Fall sind die Domänen serialized sein (einschließlich der eingebetteten Vehicle, die nicht Teil der Persistenz sein wird, wenn zu src/groovy bewegt) und equals()hashCode() für die Klassen zu erzeugen. Alte Schule funktioniert aber gut, App läuft entsprechend.

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 
} 

Nach der oben eine Spalte in Incedent für die Einbettung mit dem Datentyp VARBINARY bekommen würde (bei der Prüfung mit im Speicher H2 db). Ich würde es vorziehen, die stateName als String in Vehicle

enter image description here

+0

Ich habe es versucht, aber die Tabellenstruktur scheint nicht ganz richtig zu sein. Leider arbeite ich mit einer vorhandenen Datenbank, daher kann ich die Tabellen nicht ändern. Ich habe das ddl für meine db zu der Frage hinzugefügt - hoffentlich macht es das etwas klarer. –

Verwandte Themen