簡體   English   中英

如何在Hibernate HQL中映射抽象類或接口?

[英]How to map an abstract class or interface in Hibernate HQL?

想象一下,我有一個Debtor班。 使用Hibernate,我將像這樣定義類:

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

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

然后,我的DAO將如下所示:

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

這很好。 但是,我處於需要訪問差異模式的配置中(如此處所述 )。 當然,在每個模式中,主持債務人列表的表的名稱都不相同。 除此之外,它們可能沒有完全相同的結構。 這就是為什么我有x個不同的Debtor類(其中x是我操作的模式數量)的原因。

在我有兩個型動物模式的情況下,我將有兩個不同的Debtor類: DebtorOneDebtorTwo 為了簡化開發,我創建了一個由DebtorOneDebtorTwo都實現的Interface(或Abstract類,在這里不會改變我的問題):

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,則會從Hibernate中收到以下錯誤消息:

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

我還沒有嘗試過,但是我認為它可以工作...

我剛試過的EDIT ,它將起作用...除了NamedQuery必須為DebtorOneDebtorTwo命名不同DebtorTwo ...

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


編輯第一個答案,建議使用@MappedSuperclass 這個批注似乎對我來說是完美的解決方案,但是我仍然忘記了一些東西,因為我仍然遇到相同的錯誤。

主要Debtor

@MappedSuperclass
public class Debtor {

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

}

擴展的Debtor類別之一:

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

...

在我的DAO中:

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]

我這次想念什么?

我認為這不可能通過接口實現,而只能通過通用的抽象基類實現,該類將使用@MappedSuperclass進行注釋(有關更多詳細信息,請參見Hibernate文檔)

我認為要使其正常工作,您要么必須將Debtor表實際映射到一個表,要么使用每個類的表策略(聯合子類)。 @MappedSuperClass似乎只是實現了一種非常基本的機制來復制屬性,並且由於您無法查詢超類的實例而無法正常工作。

我把它從你已經到位的東西,以避免映射鏈接DebtorTwo在Hibernate Session對象的架構DebtorOne (否則查詢Debtor會拉的所有記錄,包括從那些DebtorTwo ,不會存在表)。 在這種情況下,請按照文檔中示例為每種情況映射子類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM