2012-06-07 95 views
2

我有一個實體,應該根據表示表名的一些字符串屬性動態地持久化到不同的表。 Hibernate的動態模型看起來就像我想要的,但我找不到如何設置表名:)任何人都可以告訴我我失蹤了什麼?提前致謝。休眠:動態設置表名

P.S.另一個發現解決方案是http://java.dzone.com/articles/hibernate-dynamic-table-routin。但我不喜歡它,因爲它看起來像骯髒的黑客。如果我將多個查詢部分命名爲要替換的子字符串,該怎麼辦?

+0

整個實體必須去另一個表,或者只是一個子集? – ssedano

+0

有一個POJO。例如。班級人員。我想從多個表中保存和檢索這個類的實例。例如。來自BAD_PERSONS_TABLE,GOOD_PERSONS_TABLE。表格具有相同的結構。有100多個這樣的表格是在運行時動態創建的。根據我們的數據庫設計和性能預測,這是最好的方法。不要試圖強迫我切換到另一個))謝謝! –

+0

你在使用JPA嗎? – ssedano

回答

1

如果您使用JPA then您可以@PrePersist

如果使用純Hibernate然後看看event

不知道它是否適合你。

它看起來像一個NamingStrategy教程是你需要的。

@Override 
public String classToTableName(String className) { 
    // your code super.classToTableName() 
} 


org.hibernate.cfg.NamingStrategy interface. 

的Hibernate 3.6都有這個接口的四種實現:

org.hibernate.cfg.DefaultComponentSafeNamingStrategy 
org.hibernate.cfg.DefaultNamingStrategy 
org.hibernate.cfg.EJB3NamingStrategy 
org.hibernate.cfg.ImprovedNamingStrategy 

實現您的代碼返回表名。

+0

嗯我也發現這種方法。問題是如何使用類名來確定表名,如果我的類名始終相同。可能的解決方案是將表名保存到數據庫然後進行檢索。但我需要同時保存/回收實體,並且我不想通過同步化來降低我的性能。有任何想法嗎?謝謝! –

+0

試過。該解決方案對我無效,因爲NamingStrategy實現僅在Hibernate初始化期間被調用。目前我正在使用我主帖中提到的dirtyhack解決方案,但實際上我不喜歡它,仍然在尋找另一個解決方案。 –

0

這更像是一個模式設計問題,那些具有相似定義和唯一名稱的表由於某些屬性而不同,爲什麼不將該屬性添加到表模式中並將所有這些表合併爲一個?那麼你只需要將這個字段添加到where子句中。

+0

這不提供問題的答案。要批評或要求作者澄清,在他們的帖子下留下評論 - 你總是可以評論你自己的帖子,一旦你有足夠的[聲譽](http://stackoverflow.com/help/whats-reputation),你會能夠[評論任何帖子](http://stackoverflow.com/help/privileges/comment)。 – honk

0

我嘗試了很多辦法,只有它是最簡單的:

Session session = super.getSession(); 
    SQLQuery query = session.createSQLQuery("raw sql"); 
    query.setParameter(":abc", "value"); 
    query.addEntity(Some.class); 
    return query.list();