2009-11-03 102 views
0

想象一下,我有一個Debtor類。與Hibernate,我會定義類這樣的:如何在Hibernate HQL中映射抽象類或接口?

@Entity 
@Table(name = "T_DEBTOR") 
public class Debtor { 

    @Id 
    @Column(name = "ID_DEBTOR") 
    private String idDebtor; 
    ... 

吾道也就那麼樣子:

public class DebtorDaoImpl implements DebtorDao { 

    @PersistenceContext 
    private EntityManager em; 

    @SuppressWarnings("unchecked") 
    public List<Debtor> findAllDebtors() { 
     Query q = em.createQuery("select d from Debtor d"); 
     return (List<Debtor>) q.getResultList(); 
    } 

這種運作良好。但是,我處於需要訪問不同模式的配置中(如指向here)。當然,在每個模式中,承載債務人清單的表格都不具有相同的名稱。除此之外,它們可能不具有完全相同的結構。那爲什麼我有x differents Debtor class(其中x是我操作的模式的數量)。

在我有兩個不同的模式的情況下,我將有兩個不同的Debtor類:DebtorOneDebtorTwo。 因爲我想減輕我的發展,我創建了一個接口(或抽象類,它不會改變我在這裏的問題)是由兩個DebtorOneDebtorTwo實施:

public interface Debtor { 

    String getIdDebtor(); 

} 

和:

@Entity 
@Table(name = "T_DEBTOR_ONE") 
public class DebtorOne implements Debtor { 

    @Id 
    @Column(name = "ID_DEBTOR") 
    private String idDebtor; 
    ... 

如果我讓我的DAO,因爲它是我從休眠出現以下錯誤:

Caused by: org.hibernate.hql.ast.QuerySyntaxException: Debtor is not mapped [select d from Debtor d] 

如果我改變我的DAO有這樣的:

public List<Debtor> findAllDebtors() { 
     Query q = em.createQuery("select d from DebtorOne d"); 
     return (List<Debtor>) q.getResultList(); 
    } 

那麼它的工作原理,但它是專門針對DebtorOne模式...

一個解決方案我看到的是定義在DebtorOneDebtorTwo類命名查詢,並從我的DAO調用這個命名查詢。 在別人的話:

@Entity 
@Table(name = "T_DEBTOR_ONE") 
@NamedNativeQueries({ @NamedNativeQuery(name = "findAllDebtors", query = "select d from DebtorOne d") }) 
public class DebtorOne implements Debtor { 

,並在DAO:

@SuppressWarnings("unchecked") 
public List<Debtor> findAllDebtors() { 
    Query q = em.createNamedQuery("findAllDebtors"); 
    return (List<Debtor>) q.getResultList(); 
} 

我沒有嘗試過,但我認爲它會工作...

編輯我只是嘗試,這將工作...除了NamedQuery必須命名不同DebtorOneDebtorTwo ...

但是,我想知道是否有辦法解決我的問題而不使用後一種解決方案?


編輯關於第一個答案,這表明使用@MappedSuperclass。這個註釋似乎對我來說是一個完美的解決方案,但我想我忘了一些東西,因爲我仍然得到同樣的錯誤。

主要Debtor

@Entity 
@Table(name = "DEBTOR_ONE") 
public class DebtorOne extends Debtor { 

... 

,並在我的DAO:

@MappedSuperclass 
public class Debtor { 

    @Id 
    @Column(name = "IDDEBTOR") 
    protected String idDebtor; // With getter and setter 

} 

擴展Debtor類的一個

public List<Debtor> findAllDebtors() { 
    return (List<Debtor>) em.createQuery("select d from Debtor d").getResultList(); 
} 

仍返回我的錯誤Caused by: org.hibernate.hql.ast.QuerySyntaxException: Debtor is not mapped [select d from Debtor d]

這次我錯過了什麼?

回答

1

我覺得這是不可能的接口,但只有一個共同的抽象基類,將與@MappedSuperclass進行註釋(見Hibernate的進一步的細節文檔)

0

我覺得這個工作你」 d必須實際將Debtor表映射到表或使用每個類策略的表(聯合 - 子類)。 @MappedSuperClass似乎只實現了一個非常基本的機制來複制屬性,並不會工作,因爲你不能查詢超類的實例。

我把它從該鏈接,您已經到位的東西,以避免映射DebtorTwo在Hibernate Session對象的DebtorOne(否則查詢Debtor會拉的所有記錄,包括從DebtorTwo表者的模式,它不會存在)。在這種情況下,請按照example from the documentation來爲任何一種情況映射子類。