使用Java中的ORM处理与接口的关联

时间:2016-06-30 07:16:09

标签: java orm associations

我想是否可以使用抽象实体处理关联(即:接口),另一个实体。 e.g:
我有一个名为class的{​​{1}},其属性Foo,类型为bar,为Bar。多个班级(interfaceBar1)实现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; } 时,它Foobar的其中一个实现的实例。

2 个答案:

答案 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_TABLEDiscriminatorColumn一起使用,则可以将所有实体存储在单个表中,并仍然可以在单个集合中检索。如果您希望能够告诉基类中的对象类型,同时将子类特定字段保存在单独的表中,您还可以将DiscriminatorColumnInheritanceType.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 {
    ...
}