Что такое хорошее решение для связи разных таблиц в Hibernate на основе некоторого значения поля? - PullRequest
1 голос
/ 27 мая 2010

У меня есть article таблица и несколько пользовательских таблиц a_user, b_user, ... с точно такой же структурой (но с разными данными).Я ничего не могу изменить в *_user таблицах, кроме префикса имени таблицы, но могу изменить все остальное (пользовательские таблицы содержат только информацию о пользователе, в них нет ничего о article или user_type).

Мне нужно связатьстатья для пользователя (многие-к-одному), но имя пользовательской таблицы определяется полем user_type.Например,

Article table record:
...
user_id="5"
user_type="a"

означает, что он связан с пользователем с id = 5 из таблицы a_user (идентификатор 5 не является уникальным в области действия пользователей, каждая таблица пользователей может иметь свой идентификатор 5).

Любые предложения, как справиться с этой ситуацией?Как я могу отобразить это отношение в Hibernate (отображение xml, без аннотаций), чтобы оно автоматически подбирало правильного пользователя для статьи во время выбора / обновления?Как мне сопоставить пользовательские таблицы (один или несколько классов?)?

Мне нужно выполнить несколько запросов, например:

from Article a where a.userType=:type and a.user.name=:name

Спасибо.

1 Ответ

3 голосов
/ 27 мая 2010

Hibernate имеет аннотацию @Any (и элемент <any> xml) для таких конструкций.

Извините за аннотации, но я не очень хорош в hbm.xml. Его можно перевести на XML, см. <any> element :

@Entity @Table(name = "Article")
public class Article {

    @Any(metaColumn = @Column(name = "user_type"))
    @AnyMetaDef(
            idType = "integer",
            metaType = "string",
            metaValues = {
                    @MetaValue(value = "A", targetEntity = UserA.class),
                    @MetaValue(value = "B", targetEntity = UserB.class)
            }
    )
    @JoinColumn(name = "user_id")
    private User user;

    ...
}

UserA и UserB используют одну и ту же схему, определенную User:

@MappedSuperclass
abstract public class User {
    @Id
    private Long id;

    private String name;

    ...
}

@Entity @Table(name = "a_user")
public class UserA extends User {}

@Entity @Table(name = "b_user")
public class UserB extends User {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...