java ORM for read only DB

时间:2010-08-16 08:14:43

标签: java database forms readonly

我知道hibernate,但我想知道只读数据库是否会有更轻的ORM引擎。我的意思是,我不需要一些事务性查询或更新一些记录。另一方面,我需要处理一些大型记录列表:

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

这种引擎存在吗? 非常感谢,

皮尔

7 个答案:

答案 0 :(得分:2)

你可以查看 JIRM (是的,这是一个无耻的插件),这是一个专注于使用不可变对象的ORM。

它位于Spring JDBC之上,因此,如果您使用的是Spring,那么尝试它的风险非常低。

它也非常好SQL placeholder templates,不需要Spring。

您应该结帐的另一个项目是jOOQ

答案 1 :(得分:1)

如果您正在寻找轻量级ORM框架,请查看OrmLite。它允许您避免设置更复杂的ORM框架(如Hibernate)的大部分开销。这个框架的缺点是它不支持标准的JPA注释,因此以后将这个ORM换成不同的ORM并不容易。

我建议尝试OpenJPA,它是由Apache基金会维护的符合JPA标准的ORM框架。它是Hibernate的主要竞争对手之一。它确实有一些设置开销,但它的优势在于,如果它不再适合您的需要,它允许您将来交换出来用于不同的JPA兼容框架(如Hibernate)。

这两个框架都是开源的,这也是使用它们的一个很好的理由。

答案 2 :(得分:1)

大约一年前,我也为一个项目搜索过精简版ORM。并尝试了其中几个。我对所有解决方案都不满意,因为他们每个人都试图朝着某个方向前进。

Hibernate是一个巨大的问题,当你想要简单的解决方案时,它可能会成为额外麻烦的来源。目前我正在研究一个很好的项目,它使用很少的自定义图层表。

您可以尝试使用JDBC使用某些模式(如Active Record或Table Gateway等)在数据库上实现一个小层。

任何ORM解决方案都会尝试非常统一,并为您的项目添加额外的广告。但是你可以创建自己的自定义无层解决方案 - 如果数据库具有预定义的表集并且不经常更改它的结构,这将特别有效。

答案 3 :(得分:1)

查看Ebeans这是一个简单的ORM工具:

  • 重用JPA注释(@ Entity,@ OneToMany ...)进行映射。
  • 使用 Session Less 架构(即具有比JPA更简单的API)。
  • 支持不可变的值对象。
  • 允许使用ORM or Relational features
  • 声称提供良好的large query支持

值得一看IMO。

答案 4 :(得分:1)

我认为你应该考虑MyBatis(IBatis 3)ORM库。它符合轻量级工作和一些重型批量执行的要求。因此,当您需要从基础ORM库中进行繁重的工作时,它将非常适合您当前的需求并且不会让您失去运气。

答案 5 :(得分:0)

Spring的SimpleJDBCTemplate结合结果映射器在只读场景中为我做了奇迹,你没有得到hibernate不必要的开销,你所有的伪ORM映射捆绑在一起,这是这种场景的真正胜利。

答案 6 :(得分: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");