Как отобразить общую сущность - PullRequest
0 голосов
/ 18 июля 2011

Мне интересно, возможно ли все-таки красиво сопоставить общие сущности с JPA.

Что такое общая сущность для меня?Скажем, многие из моих доменных сущностей имеют ассоциированные изображения.Таким образом, могут быть такие отношения, как UserProfile -> Image (изображение профиля) или Event ->* Image (изображения, рекламирующие событие, один ко многим).

При использовании чистого SQL я мог бы получить таблицу image сowner_id столбец, содержащий UserProfile#ID или Event#ID.Поскольку мне никогда не придется находить владельца изображения, а вместо этого изображения владельца, мне все равно, что я не могу сразу сказать, является ли изображение 5 изображением профиля или изображением события.

Я предполагаю, что на уровне JPA тот же самый "хак" может работать, пока у меня нет отношений один-ко-многим или много-к-одному с Image, потому что им потребуется обратная ссылка на... да, это проблема.Я не могу создать эту обратную ссылку.

Единственный возможный подход, который приходит на ум, - это создать abstract Image, содержащий все общие поля Image, а затем создать конкретный подкласс для каждого отношения.Имеет смысл?

1 Ответ

0 голосов
/ 19 июля 2011

Я не совсем понимаю, как будет работать ваш подход "чистого SQL": если вы хотите получить изображения для Event # 5, вы также получите изображения для UserProfile # 5, верно?.

Другим подходом к моделированию является введение таблицы соединения.

Вы можете создать обычные таблицы соединения для каждого типа владельца изображения с внешними ключами для владельца и для изображения в нем:

@Entity
public class UserProfile {
    @OneToOne @JoinTable
    private Image image;
    ...
}

@Entity
public class Event {
    @OneToMany // Unidirectional one-to-many uses join table by default
    private List<Image> image;
    ...
}

Кроме того, вы можете создать одну дополнительную таблицу, содержащую только первичный ключ:

@Entity
public class Images {
    @OneToMany @JoinColumn
    private List<Image> images;
    ...
}

@Entity
public class UserProfile {
    @OneToOne
    private Images images;
    ...
}
...