Hibernate或JPA或JDBC还是?

时间:2010-04-01 13:04:46

标签: java hibernate jpa jdbc dao

我正在开发Java桌面应用程序,但在为持久层选择技术方面存在一些困惑。

直到现在,我一直在使用JDBC进行数据库操作。现在,最近我学习了Hibernate和JPA,但我仍然是这些技术的新手。

  

现在我的问题是从以下内容中为我的Java桌面应用程序使用什么?

  • JPA

  • Hibernate

  • JDBC

  • DAO

  • 您提出的任何其他建议......

我知道他们没有最好的选择,这完全取决于项目的复杂性和重新考虑,所以下面是我项目的要求

  1. 这不是一个复杂的应用程序。它只包含5个表(和5个实体)
  2. 我不想让我的代码变得灵活,以便我以后可以轻松更改数据库
  3. 应用程序的大小应尽可能小,因为我必须通过互联网将其分发给我的客户。
  4. 必须可以自由地用于商业开发和分销。
  5. ==================================== EDITED ========== =============================

    根据以下答案,我想使用JPA,以防止自己编写特定于供应商的SQL代码。

    但是我在Java Persistence API

    中提到的JPA中存在一些问题

3 个答案:

答案 0 :(得分:50)

这是我的看法:

  • JPA:在不将客户端连接到Hibernate,TopLink等的情况下执行Java持久性的不可知方式。
  • Hibernate:如果您有要映射的对象模型,那么这是一个很好的选择。
  • JDBC:所有Java持久性都是基于此构建的。最低级别
  • DAO:更多的模式而不是技术; CRUD操作界面。
  • iBatis:JDBC(原始SQL)和Hibernate(ORM)之间的中途。
  • JDO:Java Data Objects,它是Java持久性的另一个规范。 (例如,Apache JDO
  

这不是一个复杂的应用程序。它只包含5个表(和5个表)   实体)

其中任何一个都可以,但JDBC将是最简单的。所有其他的都是建立在JDBC之上的。

  

我想让我的代码变得灵活,以便我以后可以更改数据库   容易

架构更改在所有技术中都会产生类似的效果。

  

应用程序的大小应该尽可能小   必须将它分发给我的客户   通过互联网。

使用JPA或Hibernate将需要增加部署大小的JAR。 JDBC将最小化这一点。

  

它必须可以自由地用于商业开发和分销。

查看所有技术的许可证。不应该是任何一个问题。

仅供参考:可以编写通用的DAO接口:

package persistence;

import java.io.Serializable;
import java.util.List;

public interface GenericDao<T, K extends Serializable>
{
    T find(K id);
    List<T> find();
    List<T> find(T example);
    List<T> find(String queryName, String [] paramNames, Object [] bindValues);

    K save(T instance);
    void update(T instance);
    void delete(T instance);
}

如果您的对象与您的五个表格以1:1的比例映射,我会说JPA过度杀伤。

您的应用目前是3MB JAR的订单吗?如果不是,则Hibernate或JPA的大小将增加一倍以上。您可以准确量化多少。并且有多个JAR,因为它们都有依赖关系。

YAGNI说你应该保持简单。这是五张桌子!

更改供应商,如果您正确地执行此操作,则意味着切换JDBC驱动程序JAR,更改驱动程序类名称以及添加新连接URL - 无论您选择何种技术,都必须执行此操作。

我发现数据库不会彻底改变。您将更改架构,但整个供应商?不太可能,特别是如果你有几个客户。制作用户群交换机数据库将是一个很大的不便。

您打算搭乘哪一个? HSQL还是需要安装MySQL的东西?这是一个更为关注的问题。

答案 1 :(得分:8)

JPA当然要走的路是你想要使用对象关系映射 - 它的实现是不可知的(意味着你可以将它与Hibernate,Toplink等一起使用)并且它是事实上的标准。 Hibernate有一个更丰富的功能集,但这是一个非标准的解决方案 - 很多人使用它...我个人总是使用由Hibernate支持的JPA。我试图远离hibernate特定的东西,但如果需要它 - 它就在我身边。

使用JPA / Hibernate这样的框架来表示5个表可能有点过分。您的应用程序将大约5MB,并将消耗更多的内存。您可以选择使用与DAO配对的JDBC。

由于JDBC使用的是特定于供应商(数据库)的SQL,因此您可能会遇到问题,因为您计划使用不同的数据库。 JPA在这方面有明显的优势。

无论你选择什么,你都不会出错 - 你需要问自己的主要是增加的大小和内存消耗是一个问题,你是否愿意编写样板DAO JDBC代码。我一般都讨厌这个: - )

答案 2 :(得分:2)

对于这种规模,任何事情都可行。也请考虑iBatis