Я дал сложную иерархию классов, для которой мне нужно найти отображение 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)