Расширение объекта

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

Обеим Пользовательским реализациям класса определили различные имена таблиц с @Table (имя = "имя").

Мои классы похожи на это


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", содержащим поля "идентификатор", "consistencyVersion", "firstname", "lastname" и "электронное письмо". Поля "имя пользователя" и "пароль" не создаются к таблице - и это - проблема, которую я имею.

5
задан Kim L 22 March 2010 в 05:20
поделиться

1 ответ

В 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;

    ...
}
6
ответ дан 14 December 2019 в 13:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: