JPA составной ключ @OneToMany - PullRequest
       10

JPA составной ключ @OneToMany

2 голосов
/ 27 сентября 2011

У меня есть следующая существующая схема БД, которую я хотел бы воссоздать с аннотациями Java и обычными JPA (используя hibernate в качестве поставщика, поэтому особые аннотации hibernate будут работать в качестве крайней меры):

CREATE TABLE users (
    user_id NUMBER NOT NULL                     -- pk
);

CREATE TABLE userdata_keys (
    userdata_key_id NUMBER NOT NULL,            -- pk
    key VARCHAR2(128) NOT NULL                  
);

CREATE TABLE users_userdata (
    user_id NUMBER NOT NULL,                    -- fk users.user_id
    userdata_key_id NUMBER NOT NULL,            -- fk userdata_keys.userdata_key_id 
    value VARCHAR2(256)                         
);

Таким образом, я создал следующие классы и аннотации:

class User {
    @Id
    Long id;
    @OneToMany
    Set<Userdata> userdata;
}

class UserdataKey {
    @Id
    Long id;
    String key;
}

class Userdata {
    String value;
    @EmbeddedId
    UserdataId userdataId;
}

@Embeddable
class UserdataId {
    User user;
    UserdataKey userdataKey;
}

Я пропустил columnName атрибуты и другие атрибуты сущностей здесь.
Однако это не совсем работает какпредназначена. Если я не укажу атрибут mappedBy для User.userdata , hibernate автоматически создаст таблицу USERS_USERS_USERDATA, но, насколько я видел, не использует ее.Однако он использует таблицу, которую я указал для класса Userdata .

Поскольку я довольно новичок в Java и в спящем режиме, все, что я делаю, чтобы проверить это в настоящее время, этоглядя на схему БД, которую hibernate создает при сохранении нескольких образцов записей.

В результате я совершенно озадачен тем, правильно ли я это делаю.Я прочитал документацию по гибернации и довольно много результатов Google, но ни один из них, похоже, не имел отношения к тому, что я хочу сделать (составной ключ с «подклассами» с их собственным первичным ключом).

Ответы [ 2 ]

3 голосов
/ 27 сентября 2011

Атрибут mappedBy является обязательным для одной из сторон каждой двунаправленной ассоциации.Когда ассоциация является «один ко многим», атрибут mappedBy помещается с одной стороны (т. Е. В поле User userdata в вашем случае).ассоциация является двунаправленной, одна сторона ассоциации всегда противоположна другой, поэтому нет необходимости дважды сообщать Hibernate о том, как сопоставляется ассоциация (т. е. какой столбец соединения или таблица соединения использовать).Если вы готовы воссоздать схему, я бы сделал это правильно (и проще) и использовал бы суррогатный автоматически сгенерированный ключ в users_userdata, а не составной.Это будет намного легче обрабатывать на всех уровнях вашего приложения.

0 голосов
/ 27 сентября 2011

Недавно я создал Many-to-Many с составным первичным ключом.

Отображение ManyToMany с составным первичным ключом и аннотацией:

Чтобы изменить его на одно-для многих это не должно быть большой проблемой.

...