2010-03-16 13 views
1

至少對於在Web應用程序的許多部分中呈現的數據,我使用hibernate的配置僅用於只讀目的。在Dao方法中有參數以獲取實體最有效的只讀訪問方式

我想一些參數添加到我的道法,所以我可以修改休眠方式拉動數據,以及它如何處理事務等

通過「拉」的數據我改變了鎖定和沒有會話擔心監視對實體的更改,因爲我想只讀,讀取未完成(以及其他任何性能調整?)。

示例用法: 我的網站首頁上的數據顯示給用戶,它是隻讀的,所以我想避免任何通常會做休眠的會話/實體跟蹤。

這是隻讀的,不會在本次交易改變數據等

什麼是提取數據的最高效的方法是什麼?

(下面的代碼是C#/ NHibernate的,我在Java中實現這是我學習它)

public IList<Article> GetArticles() 
{ 
    return Session.CreateCriteria(typeof(Article)) 
        // some where cluase 
} 
+2

目前尚不清楚你想要做什麼。此外,你的例子看起來不像Java。 – Bozho 2010-03-16 14:14:02

+0

看起來像NHibernate,它確實不是Java。請相應地更新您的問題,標籤和/或代碼,以便全部對齊。 – BalusC 2010-03-16 14:15:05

+0

我想用Java來做,只是做一個過渡。 – Blankman 2010-03-16 14:57:19

回答

0

這可能是爲何沒有session.setReadOnly方法

有幫助

http://opensource.atlassian.com/projects/hibernate/browse/HHH-2672

或者看看無狀態會話http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html#batch-statelesssession,但被告知沒有一級緩存或二級緩存支持這個(所以這可能一事實上,對你的需求來說,這是一件壞事。

+0

謝謝,好吧,我想我可以將對象添加到ehcache中。 – Blankman 2010-03-16 17:12:49

0

使用選擇新的子句。

正如JPA規範

將所得的實體實例是在新狀態說。

請注意構造函數名稱必須完全合格

所以,你可以使用

select new br.com.model.domain.User(u) from User u 

你應該提供一個構造這樣一個

public class User { 

    private String name; 

    // required no-arg constructor 
    public User() {} 

    public User(User u) { 
     this.name = u.name; 

     // And so on... 
    } 

} 

或用途春天的BeanUtils或Apache共享BeanUtils的替代如下

public User(User u) { 
    // Spring BeanUtils 
    BeanUtils.copyProperties(u, this); 

    // Apache Commons BeanUtils 
    BeanUtils.copyProperties(this, u); 
} 
0

你可以在休眠時創建一個只讀會話:

Session session = ... // Hibernate session 
session.connection().setReadOnly(true); 
session.setFlushMode(FlushMode.NEVER); 
// Your query... 
session.connection().setReadOnly(false); 
session.close(); 

或者,您可以簡單地回滾您的交易,沒有任何東西會被刷新(並且不會執行髒檢查)。

相關問題