Расширение сущности - PullRequest
       10

Расширение сущности

4 голосов
/ 21 марта 2010

У меня есть класс с именем AbstractEntity, который аннотируется @MappedSuperclass. Затем у меня есть класс с именем User (@Entity), который расширяет AbstractEntity. Оба они существуют в пакете с именем foo.bar.framework. Когда я использую эти два класса, все работает просто отлично. Но теперь я импортировал банку с этими файлами в другой проект. Я хотел бы повторно использовать класс User и расширить его несколькими дополнительными полями. Я думал, что @Entity public class User extends foo.bar.framework.User подойдет, но я обнаружил, что эта реализация User наследует поля только от AbstractEntity, но ничего от foo.bar.framework.User. Вопрос в том, как заставить мой второй класс User наследовать все поля от первого класса сущности User?

Обе реализации класса User имеют разные имена таблиц, определенные с помощью @Table (name = "name").

Мои занятия выглядят так


package foo.bar.framework;

@MappedSuperclass
abstract public class AbstractEntity {

   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
    protected Long id;

    @Column(nullable = false)
    @Version
    protected Long consistencyVersion;

    ...
}


package foo.bar.framework;

@Entity
@Table(name = "foouser")
public class User extends AbstractEntity {

    protected String username;

    protected String password;

    ....
}


package some.application;

@Entity
@Table(name = "myappuser")
public class User extends foo.bar.framework.User {

    protected String firstname;

    protected String lastname;

    protected String email;

    ....
}

Используя приведенный выше код, EclipseLink создаст таблицу с именем «myappuser», содержащую поля «id», «consistencyVersion», «firstname», «lastname» и «email». Поля "username" и "password" не созданы для таблицы - вот с чем я столкнулся.

1 Ответ

5 голосов
/ 23 марта 2010

В JPA стратегия наследования по умолчанию (т. Е. Когда она не указана) равна SINGLE_TABLE: в иерархии наследования имеется только одна таблица, и все поля сохраняются в таблице базового класса.

Если вы хотите иметь таблицу для каждого класса в иерархии наследования и чтобы каждая таблица содержала столбцы для всех унаследованных полей, вам необходимо использовать стратегию TABLE_PER_CLASS.

package foo.bar.framework;

@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
abstract public class AbstractEntity {

   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
    protected Long id;

    @Column(nullable = false)
    @Version
    protected Long consistencyVersion;

    ...
}
...