我想是否可以使用抽象实体处理关联(即:接口),另一个实体。 e.g:
我有一个名为class
的{{1}},其属性Foo
,类型为bar
,为Bar
。多个班级(interface
,Bar1
)实现Bar2
,全部也可持久。
Bar
现在我如何使用Java中的ORM来处理这个问题?即:当我检索class Foo{
Bar bar; // this will be either Bar1 or Bar2
}
interface Bar{
// some methods
}
class Bar1 implements Bar{
String s; // Bar1 and Bar2 have different represantations ,hence they must be persisted to different tables
}
class Bar2 implements Bar{
int i;
}
时,它Foo
是bar
的其中一个实现的实例。
答案 0 :(得分:4)
是的,您可以支持多态关联,但是您需要将Bar
设为abstract
基础@Entity
类而不是interface
,因为JPA不会适用于界面,例如:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Bar {
...
}
@Entity
public class Bar1 extends Bar {
private String s;
...
}
@Entity
public class Bar2 extends Bar {
private int i;
...
}
如果您通过这种方式对其进行建模,则可以使用JP-QL以多态方式查询Bar
个实例,例如: select b from Bar
。
参考:
https://docs.oracle.com/javaee/7/tutorial/persistence-intro002.htm#BNBQN
答案 1 :(得分:1)
与ck1的答案相关,但是只有一张表。
使用InheritanceType.JOINED
需要一个基表的表,每个子类需要一个表。如果将InheritanceType.SINGLE_TABLE
与DiscriminatorColumn
一起使用,则可以将所有实体存储在单个表中,并仍然可以在单个集合中检索。如果您希望能够告诉基类中的对象类型,同时将子类特定字段保存在单独的表中,您还可以将DiscriminatorColumn
与InheritanceType.JOINED
组合。
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DISC")
public abstract class Bar {
...
}
@Entity
@DiscriminatorValue("BAR1")
public class Bar1 extends Bar {
...
}
@Entity
@DiscriminatorValue("BAR2")
public class Bar2 extends Bar {
...
}