2013-04-16 24 views
6

Tôi đang cố sử dụng miền được nhúng với mối quan hệ nhiều người trong Grails 2.2.1. Đây là một phiên bản đơn giản của những gì tôi đang cố gắng làm.Thành phần GORM - miền được nhúng với mối quan hệ nhiều người-một-ném ném org.hibernate.MappingException

Tôi đang lập bản đồ các bảng db hiện:

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 rằng bản đồ để "sự cố" bảng:

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

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

miền mà các bản đồ để "nhà nước" bảng:

class State { 
    String name 
} 

Khi tôi cố gắng chạy ứng dụng của mình, tôi nhận được lỗi sau:

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

Có thể có liên kết nhiều người trong miền được nhúng không?

- Cập nhật -

tôi đã kết thúc bằng một cách giải quyết để có được nhà nước.

class Vehicle{ 

    static transients = [ "state" ] 

    Long stateId 

    static mapping = { 
     stateId column: 'state_id' 
    } 

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

tôi bắt đầu nghĩ rằng đây có thể là một lỗi grails ... Nghe có vẻ tương tự như http: //jira.grails.org/browse/GRAILS-9012 –

Trả lời

4

Tính đến Grails 2.2.1, các lớp học miền nhúng có một số vấn đề khả năng sử dụng mà làm cho họ khó có thể làm việc với, đặc biệt là trong cơ sở dữ liệu di sản.

  1. Mối quan hệ không làm việc
  2. ánh xạ cột tùy chỉnh không làm việc

Bạn nên lập bản đồ cột trực tiếp trong lớp sở hữu, sau đó tạo ra một phương pháp helper để đối phó với các đối tượng nhúng .

ví dụ .:

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

Tôi đã đi với một workaround tương tự như đề xuất của bạn và thêm một phương pháp trợ giúp để có được nhà nước. Tôi chắc chắn đồng ý với bạn về các vấn đề về khả năng sử dụng với các lớp miền được nhúng - hy vọng điều này sẽ được giải quyết trong các bản phát hành grails trong tương lai! :) –

0

Trong trường hợp này các lĩnh vực phải serialized (bao gồm cả nhúng Vehicle đó sẽ không là một phần của sự kiên trì nếu chuyển đến src/groovy) và tạo ra equals()hashCode() cho các lớp học. Trường học cũ nhưng hoạt động tốt, ứng dụng chạy một cách thích hợp.

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 
} 

Tiếp nối ở trên, bạn sẽ nhận được một cột trong Incedent cho nhúng với một kiểu dữ liệu của VARBINARY (khi thử nghiệm với trong bộ nhớ H2 db). Tôi muốn có stateName như một String trong Vehicle

enter image description here

+0

Tôi đã thử này, nhưng cấu trúc bảng dường như không đúng. Thật không may, tôi đang làm việc với một db hiện có, vì vậy tôi không thể thay đổi các bảng. Tôi đã thêm ddl cho db của tôi vào câu hỏi - hy vọng rằng nó làm cho nó rõ ràng hơn một chút. –

Các vấn đề liên quan