2010-08-16 79 views
5

我知道休眠但我不知道是否會有一個更輕的ORM引擎的只讀數據庫。我的意思是,我不需要一些事務性查詢或更新某些記錄。另一方面,我需要處理一些大的記錄清單:java ORM只讀DB

List<MyRecord> list= object.getMyRecords(); // list.size() > 1E7 

這樣的引擎是否存在? 非常感謝,

皮埃爾

+0

這有什麼錯休眠,什麼限制沒有ü到達開始尋找另一個ORM? – Vanger 2010-08-16 08:19:11

+0

我對Hibernate一無所知,但我想知道是否存在另一個ORM。我發現hibernate需要很長時間來設置很多依賴關係,事務是沒用的(在我的情況下),恐怕它不會支持列表中的大量項目。 – Pierre 2010-08-16 08:27:27

+0

對於少數類映射和只讀,我會用一個好的連接池庫(c3p0)和JDBC作爲「光引擎」。 – PeterMmm 2010-08-16 09:51:28

回答

2

您可以檢查出JIRM(是的,這是一個無恥的插頭),這是一家專注於使用不可變對象的ORM。

它位於Spring JDBC之上,所以如果你使用Spring,試用它的風險非常低。

它也有很好的SQL placeholder templates不需要春天。

您應該簽出的另一個項目是jOOQ

1

如果你正在尋找一個輕量級的ORM框架,那沒有比OrmLite。它允許您避免設置更復雜的ORM框架(如Hibernate)的大部分開銷。這個框架的缺點是它不支持標準的JPA註釋,所以稍後將這個ORM換成另外一個不太容易。

我建議嘗試OpenJPA這是Apache基金會維護的符合JPA標準的ORM框架。它是Hibernate主要競爭對手之一。它確實有更多的開銷來設置,但它的優點是可以讓你在將來換出不同於JPA的框架(如Hibernate),如果它不再適合你的需求。

這兩個框架都是開源的,這也是使用它們的一個很好的理由。

+0

實際上,ORMLite確實支持JPA註釋的一個子集,但不是完整的補充。 – Gray 2010-11-13 14:42:49

1

我在大約一年前的一個項目中搜索了lite ORM。並嘗試了幾個。我對所有的解決方案都不滿意,因爲他們每個人都試圖朝某個方向前進。

Hibernate是一個巨大的,它可以是一個額外的麻煩,當你只想簡單的解決方案的來源。目前我正在研究一個很好的項目,它使用表格上的小自定義層。

你或許可以嘗試使用一些類似活動記錄或表網關等方式使用JDBC來實現在你的數據庫中的一個小層

任何ORM解決方案只是嘗試是非常統一和廣告額外的尾巴到項目。但是,您可以創建自己的無層次解決方案 - 如果數據庫具有預定義的一組表並且不會經常更改其結構,那麼這樣做尤其可以正常工作。

+0

你看過jORM嗎? https://github.com/jajja/jorm – Martin 2013-05-07 08:51:19

+0

@Martin - 以前沒有看到它 - 訪問API看起來不錯 - 與活動記錄非常相似。感謝您的鏈接! – Vladimir 2013-05-07 10:37:37

+0

如果您有興趣,請嘗試一下,讓我們知道您的反饋。你選擇的數據庫引擎是什麼? – Martin 2013-05-08 09:45:01

1

看一看Ebeans這是一種光ORM工具:

  • 重複利用JPA批註(@實體,@OneToMany ...)的映射。
  • 使用Session Less架構(即比JPA具有更簡單的API)。
  • 支持不可變的值對象。
  • 允許使用ORM or Relational features
  • 宣稱提供良好的支持large query

值得看IMO。

0

Spring的SimpleJDBCTemplate結合了結果映射器在只讀場景中爲我工作的奇蹟,你沒有獲得不必要的休眠開銷,所有的僞ORM映射都捆綁在一起,這對這種場景是一個真正的勝利。

1

我想你應該考慮MyBatis(IBatis 3)ORM庫。它符合從輕量級工作到重批次執行的要求。所以它會很好地滿足你當前的需求,當你需要從你的底層ORM庫中進行一些繁重的工作時,它不會通過你不幸。

0

如果您正在尋找一個輕量級的ORM,我會推薦jORM。請注意,我的答案是有偏見的,因爲我是該項目的貢獻者之一。

主要的原因,我們決定寫一個輕量級替代是(的需要):

  • Hazzlefree配置
  • 清除交易定義
  • 內存管理和速度
  • 簡單的代碼生成
  • 手動調整的SQL

總之;快速發展。

示例配置

DataSource dataSource = new DataSource(); 
dataSource.setDriverClassName("org.postgresql.Driver"); 
dataSource.setUrl("jdbc:postgresql://localhost:5432/moria"); 
dataSource.setUsername("gandalf"); 
dataSource.setPassword("mellon"); 

Database.configure("moria", dataSource); // now there's a named database 

實施例記錄

@Jorm(database="moria", table="goblins", id="id") 
public class Goblin extends Record { 
    public Integer getId() { 
     return get("id", Integer.class); 
    } 
    public void setId(Integer id) { 
     set("id", id); 
    } 
    public Integer getTribeId() { 
     return get("tribe_id", Integer.class); 
    } 
    public void setTribeId(Integer id) { 
     set("tribe_id", id); 
    } 
    public Tribe getTribe() { 
     return get("tribe_id", Tribe.class); 
    } 
    public void setTribe(Tribe tribe) { 
     set("tribe_id", tribe); 
    } 
    public String getName() { 
     return get("name", String.class); 
    } 
    public void setName(String name) { 
     set("name", name); 
    } 
} 

實施例映射查詢

Goblin goblin = Record.findById(Goblin.class 42); 

List<Goblin> goblins = Record.findAll(Goblin.class);Goblin bolg = Record.find(Goblin.class, new Column("name", "Bolg")); 

例的自定義查詢

Tribe tribe = new Tribe(); 
tribe.setId(1); 
String name = "Azog"; 

Goblin azog = Record.select(
    Goblin.class, 
    "SELECT * FROM goblins WHERE name = #1# AND tribe_id = #2:id#", 
    name, // #1# 
    tribe // #2# 
); 

Goblin bolg = Record.find(Goblin.class, "SELECT * FROM goblins WHERE name = #1#", "Bolg");