java - 什么时候使用 Hibernate/JPA/Toplink?

标签 java hibernate orm jpa toplink

现在我正在制作一个非常简单的网站 - 大约 5 页。问题是集成某种数据库映射解决方案是否过分且值得花时间,或者只使用普通的旧 JNDI 是否会更好。我可能有很多东西需要从数据库中读/写。我想我对这些技术有基本的了解,但仍然需要大量引用文档。还有其他人以前面临过这个决定吗?

编辑:抱歉,我应该指定 JNDI 来查找数据库连接,并指定 JDBC 来执行操作。

最佳答案

简短回答:这取决于您要支持的复杂性。

长答案:

首先,ORM(对象关系映射——您所说的数据库映射)和 JNDI(Java 命名和目录接口(interface))是两个不同的东西。

如您所知,第一个用于将数据库表映射到类和对象。二是提供资源查找机制,可能是DataSources、Ejb、Queues等。

也许您的意思是“JDBC”。

现在关于您的问题:如果这么简单,可能就没有必要实现 ORM。数字表最多大约是 5 - 10,我猜操作真的很简单。

可能使用普通 JDBC 就足够了。

如果您使用 DAO 模式,您可以在以后根据需要更改它以支持 ORM 策略。

像这样: 假设您有 Employee 表

您可以手动创建包含数据库所有字段的 Employee.java(不会花太长时间)和 EmployeeDaO.java,方法如下:

+findById( id ): Employee
+insert( Employee ) 
+update( Employee )
+delete( Employee ) 
+findAll():List<Employee>

而且实现非常简单:

select * from employee where id = ?
insert into employee ( bla, bla, bla ) values ( ? , ? , ? )
update etc. etc 

当(并且如果)您的应用程序变得过于复杂时,您可以更改 DAO 实现。例如,在“select”方法中,您更改代码以使用执行操作的 ORM 对象。

public Employee selectById( int id ) {
      // Commenting out the previous implementation...
      // String query = select * from employee where id = ? 
      // execute( query )  

      // Using the ORM solution

       Session session = getSession();
       Employee e = ( Employee ) session.get( Employee.clas, id );
       return e;
}

这只是一个例子,在现实生活中你可以让抽象工厂创建 ORM DAO,但那是题外话。关键是您可以从简单开始,通过使用设计模式,您可以在以后需要时更改实现。

当然,如果你想学习技术,你甚至可以从一张 table 开始。

选择一个或另一个(ORM 解决方案)基本上取决于您使用的技术。例如,对于 JBoss 或其他开源产品,Hibernate 非常棒。它是开源的,有很多资源可供学习。但是,如果您使用的是已经具有 Toplink 的东西(如 oracle 应用程序服务器),或者如果基础已经构建在 Toplink 上,您应该继续使用该框架。

顺便说一下,自从 Oracle 收购了 BEA,他们说他们正在用现在称为“Oracle Weblogic Application Server”的 toplink 替换 Kodo(weblogic peresistence framework)。

我给你留下了一些资源,你可以从中获得更多相关信息:


在这本“企业应用程序架构模式”一书中,Martin Fowler 解释了在哪里使用一个或另一个,这里是目录。查看数据源架构模式与对象关系行为模式:

PEAA Catalog


DAO(数据访问对象)是核心 J2EE 模式目录的一部分:

The DAO pattern


这是 Hibernate 的入门教程:

Hibernate


Toplink官网:

Toplink


最后,我“认为”JPA 的好处是您最近可能会更换供应商。

从简单开始,然后发展。

希望对您有所帮助。

关于java - 什么时候使用 Hibernate/JPA/Toplink?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/122571/

相关文章:

java - infinispan 缓存可以在使用 hibernate 的同一 Spring Boot 应用程序的多个实例之间共享吗?

java - 如何仅替换列表中的特定值

python - 聚合前的算术运算

sql - 为什么 n+1 选择模式很慢?

java - 嵌入式 Java 键值存储

java - 找不到基本名称的 bundle

java - 线程 “main”中的异常java.lang.NoClassDefFoundError : Solution (wrong name: solution)

java - 询问包含数组中包含的字母的单词

java - "NOT IN"与 HQL 和 Grails

java - NoSuchMethodError : org. hibernate.SessionFactory.openSession()