卡宴是我的要求的好选择吗?

时间:2010-02-25 13:10:54

标签: java hibernate orm apache-cayenne

我们正在为我的项目评估ORM解决方案,该解决方案在业务层和数据层(JDBC)之间具有紧密耦合。我开始用Cayenne做一个PoC。我的要求是这样的 a)已经存在数据库模式 b)架构是非常精细的级别。即实时java对象只能通过组合表来派生。 c)目前我只想执行读操作(通过输入标准对列表进行精确过滤和排序)

到目前为止,我对Cayenne所做的观察是 1)表和对象紧密耦合。 Modeler不允许在没有关联表的情况下创建java对象。 2)我找不到简单的方法将命名查询的输出映射到java对象,以便以应用程序需要的方式获取列表。 3)我也不确定Expressions是否可以使用命名查询。

我想知道您对我的要求的最佳选择?

提前谢谢。

3 个答案:

答案 0 :(得分:5)

如果我不得不选择一个ORM工具或一个JPA提供商,它就不会仅仅是因为它似乎没有被广泛使用,所以它背后的社区不是很大而且这是一个问题。因此没有必要讨论技术问题,像Cayenne 2.0这样的东西是侵入性的,你必须实现一个接口或扩展一个超类(Cayenne 3.0有POJO支持,但在2年多之后仍然处于测试阶段......)。不,真的,如果你需要一个ORM工具,我认为没有任何理由不选择Hibernate,即事实上的标准。

但是...

鉴于你的要求,ORM实际上可能不是最好的选择,因为b)因为我会考虑使用iBatis(它不是O / R映射器,它是数据映射器)。

答案 1 :(得分:4)

Cayenne有许多非常好的功能,从好的方面来说,你可以在项目中使用许多开源工具。 Hibernate适合一些人和Cayenne其他人。我知道,对于更多自己的使用,Cayenne远远优于Hibernate,主要是因为这些因素:

  • 一个非常有用的用户社区。 Hibernate可能有点磨损。
  • 一个非常强大的代码库,提供大量代码覆盖率的大量测试
  • ROP(三层)支持。如果您需要,这本身就是一个巨大的功能。
  • 良好的继承支持
  • Cayenne modeler

是的,Cayenne方法是Object Entities(映射到db的Java客户端)扩展超类。这比Hibernate(Cayenne控制整个对象生命周期)带来了一些明显的优势,并为某些人带来了复杂性。

我也发现Cayenne管理Context(一组对象和更改,后来将一起提交)的方式非常直观。

关于你的问题:

1)Cayenne绝对允许您在没有一对一地图的情况下创建对象实体。我们一直这样做,特别是在建模继承时。

2)SQLTemplate将让你获得命名查询,但你会发现大多数ORM会引导你远离这种方法,因为你正在反对ORM直接在数据库中构建查询的自然方式。关键是尽可能抽象数据库。

3)SQLTemplate可以让你做任何你想做的事情。但同样,采用ORM是关于编写应用程序的策略,而不仅仅是JDBC的轻量级包装器。我相信这些好处是巨大的,我们的项目也受益,但这取决于你的目标。

答案 2 :(得分:0)

同意,Cayenne有很多很好的功能。但是如果你的项目需要做一些继承工作(你没有提到它),那么最终Cayenne就不是一个选择。它没有“良好的继承支持”:

水平继承 - https://issues.apache.org/jira/browse/CAY-795 - 自30 / May / 07开始; 讨论自2010年5月18日起http://cayenne.195.n3.nabble.com/Vertical-inheritance-td827636.html上的垂直继承

我经常在我的个人项目中使用它,并且生产力的提高非常好。