2013-11-10 3 views
1

У меня есть готовая схема таблицы базы данных, и мне нужно использовать ее в приложении Grails.Графическое сопоставление доменных классов Grails в отношениях один к одному

Мои таблицы в PostgreSQL:

CREATE TABLE "user" (
    id serial NOT NULL, 
    login character varying(32) NOT NULL, 
    password character varying(32) NOT NULL, 
    email character varying(255) NOT NULL, 
    date_created time with time zone NOT NULL DEFAULT now(), 
    last_updated time with time zone NOT NULL DEFAULT now(), 
    is_banned boolean DEFAULT false, 
    CONSTRAINT "PK_user_id" PRIMARY KEY (id), 
    CONSTRAINT "UN_user_email" UNIQUE (email), 
    CONSTRAINT "UN_user_login" UNIQUE (login) 
) 

CREATE TABLE profile (
    "user" integer NOT NULL DEFAULT nextval('profile_id_seq'::regclass), 
    first_name character varying(25) NOT NULL, 
    middle_name character varying(25) NOT NULL, 
    last_name character varying(25) NOT NULL, 
    address integer, 
    CONSTRAINT "PK_PROFILE_user" PRIMARY KEY ("user"), 
    CONSTRAINT "FK_PROFILE_user_USER_id" FOREIGN KEY ("user") 
     REFERENCES "user" (id) MATCH SIMPLE 
     ON UPDATE RESTRICT ON DELETE CASCADE 
) 

Как вы можете видеть, «профиль» таблица имеет первичный ключ, который является его внешний ключ тоже. Это основная «особенность», с которой возникают проблемы с отображением карт.

Моя реализация таблиц отображения на классы Grails домена:

class User { 
    ... 
    static hasOne = [profile : Profile]; 
    ... 
} 

class Profile { 
    ... 
    User user; 
    ... 
    static mapping = { 
     id name: 'user' 
     version false 
     address column: 'address' 
     user column: '`user`' 
    }; 
    ... 
} 

Этот класс отображения аварии с исключением:

Invocation of init method failed; nested exception is org.hibernate.MappingException: Could not determine type for: ru.redlisa.model.User, at table: profile, for columns: [org.hibernate.mapping.Column(user)] 
  1. Как правильно картировать таблицы в Grails домена классов?

  2. Как получить интерфейс взаимодействия?

так:

User user = new User(); 
user.addToProdile(new Profile()); 

Или

new User(profile: new Profile()).save(); 

ответ

1

Большое спасибо araxn1d для показа правильный путь с иностранными генератор. Я переписал свои домены следующим образом:

class User { 
    ... 
    static hasOne = [profile : Profile]; 
    ... 
} 

class Profile { 
    ... 
    static belongsTo = [address: Address, 
         user: User]; 
    ... 
    static mapping = { 
     id column: '`user`', generator: 'foreign', params: [ property: 'user'] 
     version false 
     address column: 'address' 
     user column: '`user`', insertable: false, updateable: false 
    }; 
    ... 
} 

и он работает!

6

Вы могли бы попытаться использовать этот подход:

class User { 
... 
Profile profile 
... 
static mapping = { 
    id column: 'user', generator: 'foreign', params: [ property: 'profile'] 
    ... 
    } 
} 
+0

А как насчет класса Profile? Должен ли я оставаться таким же? – ArtLab

Смежные вопросы