Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Hibernate: маппинг сущностей с наследованием.


Автор: MaxPayneC 8.2.2010, 16:35
В базе имеются две таблицы, users и employers. Во второй есть поле, являющееся внешним ключом на основной ключ первой. В бизнес-логике приложения однако User должен быть абстрактным классом, а Employer должен от него наследоваться. Возникает вопрос - как это сделать с помощью аннотаций?
Пробовал варианты
Код

@MappedSuperclass
@Table(name = "users")
@AttributeOverride(name = "id", column = @Column(name = "user_id"))
public abstract class User extends AbstractEntity
{...}

@Entity
@Table(name = "employers")
@Inheritance(strategy = InheritanceType.JOINED)
@AttributeOverrides({
        @AttributeOverride(name = "id", column = @Column(name = "employer_id"))
//        @AttributeOverride(name = "login", column = @Column(table = "users", name = "login")),
//        @AttributeOverride(name = "passwordHash", column = @Column(table = "users", name = "pwd_md5")),
//        @AttributeOverride(name = "role", column = @Column(table = "users", name = "access_level"))
})
public class Employer extends User
{...}


Работоспособности добиться не удалось :( Пробовал также делать с @SecondaryTable (в комментариях видны оверрайды полей для этой аннотации) - тоже не работает. Как реализовать наследование, описанное в первом параграфе?

Автор: MaxPayneC 8.2.2010, 21:49
Погуглив, выяснил, что вторичные таблицы, где основная таблица хранит ссылку на вторичную, а не наоборот, не поддерживаются. В связи с этим возникает вопрос - как лучше всего сделать? Пока что моя лучшая идея - это все же пометить сделать класс User аннотацией @Entity, убрать его абстрактность, и сделать его package local. Какие недостатки у этого подхода, и нет ли у кого лучших идей? И еще небольшой вопрос, в силу логики приложения, у потомков класса User не потребуется менять UserRole, т.е. сеттер на него нам не нужен, но хибернейт настоятельно просит его дать. Как лучше всего выйти из этой ситуации?

Автор: Joss 9.2.2010, 16:16
А почему  User  помечен как  MappedSuperclass  и в тоже время для него указана таблица. MappedSuperclass по определению не мапится ни на какую таблицу, и служит только как суперкласс для Entities, содержащий общее состояние или поведение. Если могут существовать сущности типа User, то класс следует сделать Entity.

Автор: MaxPayneC 9.2.2010, 17:45
Без указания таблицы я тоже пробовал.

Автор: Joss 10.2.2010, 10:04
Ну тогда и никакого Inheritance указывать тоже не нужно было...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)