2016-06-30 16 views
6

我想它是否能夠處理的協會抽象實體的接口關聯(即:一個接口),在另一個實體。例如:
我有一個class調用Foo它有一個屬性bar,它是Bar類型,它是一個interface。多個類別(Bar1,Bar2)實現Bar並且都是全部可持久處理使用ORM在Java中

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; 
} 

現在我該如何使用Java中的ORM來處理這個問題?即:因此,當我檢索Foo時,它的barBar實現之一的一個實例。

+0

Hibernate支持三種基本的繼承映射策略: 1.每類層次 2.每個子類表 3.每個具體類 – amitmah

+0

表參照表:https://docs.jboss.org /hibernate/orm/3.5/reference/en-US/html/inheritance.html 我認爲你可以像處理Hibernate中的Abstract類一樣處理接口。 – amitmah

回答

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

+0

問題特別要求與**界面**關聯。也就是說,爲一個類提供不同的「視圖」,這不能用抽象類來完成。 – user2268997

+0

答案是正確的。可能它依賴於ORM提供者。只要我知道Hibernate是正確的。它與Interfaces不兼容。爲了使用接口,你需要定義實現類。一旦你做了多態性被破壞。 –

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 { 
    ... 
}