Проблема с поиском правильного отображения JPA для иерархии классов, содержащей интерфейс - PullRequest
0 голосов
/ 28 ноября 2018

Я дал сложную иерархию классов, для которой мне нужно найти отображение JPA.Я сократил основную проблему до самого простого случая:

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public abstract class A extends TimestampedEntity<Long> {

    /* How to map this interface? */
    @OneToMany(mappedBy = "a") // this does not work in JPA
    private List<Special> specials;
    ...
}

@Entity
public class B extends A {}

@Entity
public class C extends A {}

Interface Special {
    void setA(A a);
    A getA();
}

@Entity
public class SpecialB extends B implements Special {
    @ManyToOne
    private A a;
    // getter, setter, ...
}

@Entity
public class SpecialC extends C implements Special {
    @ManyToOne
    private A a;
    // getter, setter, ...
}

Согласно многим постам, в которых рассматривается проблема, JPA не может отображать интерфейсы, общее решение состоит в том, чтобы сжать абстрактный класс между интерфейсом и его реализующими классамии сопоставить абстрактный класс вместо интерфейса.Это, очевидно, здесь невозможно, поскольку иерархия наследования глубже, а классы, реализующие Special, уже наследуют.

Каков общий подход для решения этой проблемы?Единственный способ, о котором я могу подумать, - это избавиться от интерфейса и загромождать код с помощью instanceof везде, где требуется экземпляр Special, что нежелательно.Может ли кто-то с большим опытом в отображении JPA указать лучшее решение?

(Java EE 8, Wildfly 12, JPA 2.2, Persistence Provider Hibernate 5.1.10)

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