轻量级的 Hibernate 替代方案?

119

我有一个单用户的Java程序,希望它可以将数据存储在诸如Derby或Sqlite之类的轻量级数据库中。我想在程序中使用一个数据抽象层。Hibernate需要大量配置,对于我所需的功能来说有些过度。有没有比Hibernate更轻量级的替代方案?


2
您可以在此处查看备选方案以及示例用法(以及与Spring的示例配置):https://github.com/bwajtr/java-persistence-frameworks-comparison - Břetislav Wajtr
CMobileCom JPA是一个轻量级的JPA实现,适用于Java和Android。它的大小约为380K。它轻巧快速。https://cmobilecom.com - John
14个回答

141

Hibernate如果使用注解的话,几乎不需要进行任何配置。它甚至可以自动发现类路径中映射的Bean!从简单性和功能强大方面来看,我认为没有比它更好的替代品。

它还可以作为JPA暴露出来,这甚至更加简单(在我看来)。


39
接近于零并不等于零。 - njzk2
13
它需要很多外部库,尝试在安卓上使用吧 :P - sherif
4
我试图寻找一个比Hibernate更简单的替代方案。在个人项目中,我使用了MyBatis(名字真糟糕)。但是相比于Hibernate,这需要付出更多的工作。Hibernate确实节省了很多SQL编码并帮助处理父子关系。我还尝试查看了几个Java的ActiveRecord风格的ORM,但没有一个看起来比Hibernate更成熟或更容易使用。因此,我决定回到Hibernate。 - devdanke
63
问题不是关于一种"替代方案"吗? - Łukasz Gruner
12
Hibernate 不是 Hibernate 的轻量级替代品。 - cosbor11
显示剩余4条评论

58

我的ORMLite库就是这样一种替代方案。它支持MySQL、Postgres、Microsoft SQL Server、H2、Derby、HSQLDB和Sqlite,并且可以轻松扩展到其他数据库。它使用注解来配置类,支持Spring,具有灵活的查询构建器等功能。


2
OrmLite看起来真的很有前途!但是这个项目还活着吗?一年多没有新版本了,在Github上也没有回应拉取请求/问题。 - Stefan
3
2016年6月发布了5.0版本。 - Lauri Laanti
版本5.1于2018年2月19日发布。但它与Hibernate不可比,而且一些JPA注释实现无法正常工作。 - M-Razavi
1
与Hibernate相媲美?它们都是ORM,但在其他方面有很大的不同。关于JPA实现,请在@M-Razavi找到问题时填写缺陷报告。 - Gray

32

1
iBatis非常轻量级。您可以更轻松地定义和控制SQL到对象的映射。 - Berlin Brown
我必须为iBatis投一票,不过请注意它并非ORM的替代品,因为它并不试图与Hibernate等竞争。它是一种有点不同的东西,但符合你在重量方面寻找的要求。 - vector
1
现在只剩下MyBatis了:http://www.mybatis.org/ - Vladislav Rastrusny
3
我认为i/MyBatis中的XML实际上是一个优点,因为它将复杂的查询保留在一个格式中,可以轻松地将其复制到SQL控制台进行测试。 - Peter Tillemans

24

jOOQ是一款集源代码生成、完整支持标准SQL(包括UNIONs,嵌套SELECTs,各种JOINs,别名(例如自连接)等SQL语言特性)、广泛支持非标准SQL(包括UDT's,存储过程,供应商特定函数等)于一身的流畅DSL库,直接在Java中模拟SQL语句。

阅读关于jOOQ的文章:http://java.dzone.com/announcements/simple-and-intuitive-approach,或直接访问网站:http://www.jooq.org

(免责声明,我为jOOQ背后的公司工作)


3
jOOQ很棒!我们使用它实现了一个大规模的ETL服务,非常满意。我以前用过iBATIS,而jOOQ可以提供低级SQL的所有优势,而不需要大量的XML和缺乏类型安全性。 - spieden
3
我忘了提到 jOOQ 最好的特点之一:复杂和/或动态生成的查询可以被控制地组装,并由Java编译器进行验证,这样就可以避免数据库抛出的所有模糊语法错误,并在架构更改时提供编译时回归覆盖。 - spieden
JOOQ很棒,但显然现在对于Oracle和Sybase来说不再是免费的了,所以很多人避免使用这个框架,转而使用像MyBatis这样的框架。 - Makky
@Makky:感谢您的反馈。我希望您能牢记实际的价值主张,并且不会仅仅因为一个框架是免费的而转向完全不同的框架。这将导致在您的软件中维护和迁移的成本过高,超出了任何合理的商业许可证... - Lukas Eder

16

Apache Commons DBUtils可以减少JDBC编程中的重复性工作,需要进行少量配置且易于学习。它不是ORM框架(例如Hibernate和其他提到的框架),但它确实自动将SELECT列映射到Java成员字段以及其他重复的JDBC编程任务。它肯定是轻量级的。


12
你可以查看 Ebean ORM。 - 没有会话 - 惰性加载功能正常工作 - 更简单易用的API。

它是否与SQLite和Android兼容? - endryha
已添加了SQLite支持。我还没有在Android上尝试过。 - Rob Bygrave

9

Cayenne 已经帮助我很多。相对来说,它比较容易理解并且上手。我特别喜欢它的反向工程部分。配置可以通过图形用户界面进行。


6
我可以推荐使用Apache Empire-db。 http://incubator.apache.org/empire-db/ Apache Empire-db是一个开源的关系型数据持久化组件,它允许独立于数据库供应商的动态查询定义以及安全简单的数据检索和更新。与大多数其他解决方案(如Hibernate、TopLink、iBATIS或JPA实现)相比,Empire-db采用了一种明显不同的方法,特别注重编译时安全性,减少冗余并提高开发人员的生产力。
以下是一个示例:
// Define the query
DBCommand cmd = db.createCommand();
DBColumnExpr EMPLOYEE_FULLNAME= db.EMPLOYEES.LASTNAME.append(", ")
                        .append(db.EMPLOYEES.FIRSTNAME).as("FULL_NAME");
// Select required columns
cmd.select(db.EMPLOYEES.EMPLOYEE_ID, EMPLOYEE_FULLNAME);
cmd.select(db.EMPLOYEES.GENDER, db.EMPLOYEES.PHONE_NUMBER);
cmd.select(db.DEPARTMENTS.NAME.as("DEPARTMENT"));
cmd.select(db.DEPARTMENTS.BUSINESS_UNIT);
// Set Joins
cmd.join(db.EMPLOYEES.DEPARTMENT_ID, db.DEPARTMENTS.DEPARTMENT_ID);
// Set contraints and order
cmd.where(EMP.LASTNAME.length().isGreaterThan(0));
cmd.orderBy(EMP.LASTNAME);;

3

这个应该放在最顶部。它非常棒! - qwertzguy

3

我可能有点晚了,但是我在2010年发布了ActiveJDBC,这是ActiveRecord模式的ORM实现,比Hibernate更轻量级(只有10倍的依赖)且运行时至少快两倍,并且不需要任何配置或注释。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接