2011-02-11 57 views
3

我有一個實體。有時我需要這個對象也包含一些價值,稱之爲'深度'。查詢可能看起來像'select b.id, b.name, b..., count(c.id) as depth from Entity b, CEntity c where ...'。所以我創建了擴展Entity的NonHibernateEntity類。然後,上面所寫的查詢結果完全存儲爲List of NonHibEntity,它由Entity的所有字段(擴展時)以及屬性'depth'組成。我通過設置aliasToBean結果轉換器來完成它:.setResultTransformer(Transformers.aliasToBean(NHEntity.class)). 但是,它很煩人和不方便 - 指定所有所需字段的所有別名。 然後,如果我想將這個對象中的一個保存到DB - session.saveOrUpdate((Enity)nHibEntity) - nHibEntity不是Hibernate Entity的例外。如何將計入DB的屬性添加到@Entity類?

我聽說在nonHibEntity(聚合,而不是繼承)中存儲'實體'作爲字段。但是這似乎也很不方便。 你覺得呢?什麼是合適的解決方案?

回答

0

如果有人想知道 - 我解決了這樣的方式這個問題:

剛剛公開了此計算字段爲@Transient,然後

List<BaseEntry> result = new ArrayList<BaseEntry>(); 
    Iterator it = session() 
    .createQuery("select b, (select count(p.id) as depth from BaseEntry p " + 
      " where ...) as d" + 
      " from BaseEntry b " + 
      " where ... ") 
    .list().iterator(); 
    while (it.hasNext()) { 
     Object[] row = (Object[]) it.next(); 
     BaseEntry entry = (BaseEntry) row[0]; 
     Long d = (Long) row[1]; 
     entry.setD(d); 
     result.add(entry); 
    } 
    return result; 

它的工作好,看來,它可以在未來很容易支持

1

A Formula列映射可能適合您的需求。我會先試試這個。

如果您擔心會導致性能問題,那麼您可以嘗試僅在子項中使用此字段的映射類層次結構,並將兩者映射到同一個表。不知道這會實際上工作,雖然...

作爲最後的手段,做你現在使用一個非映射類,但實體作爲你的其他類中的字段 - 聚合而不是繼承作爲你說,並確保有一種方法可以從未映射的實體中檢索映射實體,以便保存。將它設置爲Decorator是明智的,因此它既是子類又是聚合類,並且您可以繼續忽略大部分代碼中的區別。

但是,對於未映射的子類和/或聚合,您必須抽出實體才能保存。

+0

但是這個列將在每次我從我的數據庫獲得我的對象時計算出來。我有時只需要這個專欄。每次計算它可能會影響性能。 – javagirl 2011-02-12 09:22:56