У меня есть класс под названием 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" и "электронное письмо". Поля "имя пользователя" и "пароль" не создаются к таблице - и это - проблема, которую я имею.
В 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;
...
}