我给了一个复杂的类层次结构,我必须为其找到一个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)