Spring-Data Jpa Inheritance: сохранение идентификатора объекта в объекте Children - PullRequest
0 голосов
/ 14 ноября 2018

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

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class TreeStructure<T extends TreeStructure>
{
    @ManyToOne
    protected  T parent;

    @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
    protected Set<T> children = new HashSet<>();
    //...

Затем яу меня есть две сущности, которые расширяют его:

@Entity(name = "TreeStructureOne")
public class TreeStructureOne extends TreeStructure<TreeStructureOne>
{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @JsonProperty("TreeStructureOne_id")
    private long id;

И я в основном хочу, чтобы база данных полностью не знала об этой TreeStructure абстракции и сохранила все поля в каждой таблице сущностей и ожидала InheritanceType.TABLE_PER_CLASS, чтобы справиться с этим,Но, похоже, мне нужно определить Id в сущности TreeStructure, по крайней мере, или я получу:

Invocation of init method failed; nested exception is org.hibernate.AnnotationException: No identifier specified for entity: TreeStructure

И я не хочу добавлять IDв абстрактный класс, поскольку он создает в базе данных три таблицы: HT_TREE_STRUCTURE, HT_TREE_STRUCTURE_ONE и HT_TREE_STRUCTURE_TWO с одним полем ID каждое.

Есть ли какое-либо решение для этого?

1 Ответ

0 голосов
/ 15 ноября 2018

Поскольку TreeStructure не является @Entity, используйте только @MappedSuperclass

@MappedSuperclass
public abstract class TreeStructure<T extends TreeStructure> {

вместо @Entity и @Inheritance для родительского класса.

Вы можете найти @MappedSuperclass в документации Oracle JEE API .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...