65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 NW.ORM 简化 ORM

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.33/5 (3投票s)

2013 年 10 月 29 日

CPOL

3分钟阅读

viewsIcon

16463

NW.ORM,一个用于处理 Hibernate 的辅助框架。

目录

引言

在实现与数据库相关的软件时,对于像我这样的普通 Java 开发人员在使用 hibernate 时,通常会发生以下操作。

  • 添加 hibernate 依赖
  • 创建所需的实体
  • 将实体映射添加到配置文件
  • 实现 Session Factory Builder
  • 实现一个服务层来查询系统(可能为每个实体创建 DAO)
  • 在服务层实现 CRUD 方法
  • 开始编写应用程序.....

问题不在于要做的事情数量,而在于每次出现新项目时所需的重复程度。此外,多个开发人员的项目通常趋向于不同的实现,每个开发人员都按照自己认为最好的方式处理数据库会话。在处理多个数据库时,需要开发人员重新实现系统的某些方面。

NW.ORM 旨在通过创建统一且可重用的方法来简化数据库访问,从而实现需要数据库访问的软件。让开发人员有更多时间专注于实际的项目工作。该框架底层使用 hibernate 库进行数据库事务。

NW.ORM 提供什么

  • 所有数据库事务的单一接口。不需要多个数据访问对象。
  • 在同一应用程序中同时处理多个数据库
  • 使用 Hibernate Criteria、HQL 或 SQL 查询
  • 支持基于 JPA 和基于 HBM 文件的配置
  • 返回适当的类对象,无需强制类型转换
  • 提供映射的超类,用于快速创建基于 JPA 的实体

如何使用

使用该框架

  • https://sourceforge.net/projects/nw-orm/files/ 获取最新版本
  • 将依赖项添加到您的项目
  • 依赖项

    NW.ORM 具有以下依赖项

    • Hibernate 框架
    • Neemworks Commons
    • Slf4j Logger

    Hibernate 和 slf4j 依赖项可以从它们各自的网站下载,而 Neemworks commons 可在 NW.ORM sourceforge 文件目录中找到。

    设置开发环境

    只需将 NW.ORM jar 文件及其依赖项添加到您的项目类路径中。

    设置好项目类路径后,就可以开始实际使用了。基本上,要开始使用数据库,通常需要先创建必要的实体对象。您可以扩展 REntity 对象或 IEntity ,而不是从头开始。REntity 提供基于 UUID 的主键,而 IEntity 提供 Long 类型的。它还提供了我的一些方法,例如能够在运行时获取目标数据库 TABLE (不一定需要与对象名称匹配)的名称。请参见下面的代码片段。

    定义和映射实体 

    @Entity
    @Table(name = "ACCESS_TOKEN")
    public class AccessToken extends REntity {
    
    	private static final long serialVersionUID = -5221279551618337736L;
    }

    所有实体都必须在 hibernate 配置文件中进行映射,这是 hibernate 所必需的。在需要访问多个数据库的情况下,允许多个配置。下面是一个使用 PostgreSQL 数据库的示例配置文件,映射了 4 个实体。

     <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        <session-factory>
            <property name="hibernate.show_sql">false</property>
            <property name="hibernate.format_sql">false</property>
            <property name="use_sql_comments">false</property>
      <property name="hbm2ddl.auto">update</property>
    	  <property name="show_sql">false</property>
    
            <property name="hibernate.dialect">
            org.hibernate.dialect.PostgreSQLDialect</property>
            <property name="hibernate.connection.driver_class">
            org.postgresql.Driver</property>
         	 <property name="hibernate.connection.url">
         	 jdbc:postgresql://:5432/**db</property>
            <property name="hibernate.connection.username">**d**</property>
    	 <property name="hibernate.connection.password">*minds</property>
    
    	 <property name="hibernate.c3p0.min_size">5</property>
    	 <property name="hibernate.c3p0.max_size">30</property> <!-- seconds -->
    	 <property name="hibernate.c3p0.timeout">1800</property>
    	 <property name="hibernate.c3p0.max_statements">50</property>
    
            <!-- add classes to map from here -->
            <mapping class="com.nw.napi.model.NUser" />
            <mapping class="com.nw.napi.model.NimblarClient" />
            <mapping class="com.nw.napi.model.AccessToken" />
            <mapping class="com.nw.napi.model.ReleaseNotificationRequest" />
        </session-factory>
    </hibernate-configuration>

    对于非 JPA 配置(即基于 hbm 的配置),只需要在类路径中添加适当的 hibernate 配置文件。

    查询

    此时,要初始化特定数据库的服务层,其配置文件名为 hibernate.cfg.xml。需要一个 REntityManager 实例,如下所示。

    // Create an instance
    REntityManager rm = REntityManager.getInstance("hibernate.cfg.xml");  

    如果需要多个数据库配置,可以重复此操作。请参见下面的代码片段,这是一个使用配置文件 text.cfg.xml 的另一个配置。

    // Create an instance
    REntityManager rmText = REntityManager.getInstance("text.cfg.xml"); 

    REntityManager 为所有实体提供基本的 CRUD 操作。

    // Create Sample Entity RAUdit
    RAudit ra = new RAudit();
    ra.setSourceMachine("mac");
    rm.create(ra);
    rm.update(ra); 
    rm.remove(ra);

    下面显示了查询数据库的示例方法。

    查询 sourceMachine 列值为 mac 的表,该方法接受一个结果类以启用适当的返回类型。

     // Find By Criteria
    RAudit audit = rm.getByCriteria(RAudit.class, Restrictions.eq("sourceMachine", "mac"));
    System.out.println(audit.getSourceMachine()); 

    HQL 查询示例

    // Find By HQL
    Map<String, Object> parameters = new HashMap<String, Object>();
    parameters.put("sa", "mac");
    RAudit audit2 = rm.getByHQL("FROM RAudit r where 
    r.sourceAddress = :sa", parameters, RAudit.class);
    System.out.println(audit2.getSourceMachine()); 

    列表结果可以使用 getListxxxxxx 方法返回,如下所示。

    // Find All List
    List<RAudit> laudits = rm.getListByCriteria(RAudit.class);
    
    // Find List by conditions
    List<RAudit> lauditsc = rm.getListByCriteria(RAudit.class, 
    Restrictions.eq("sourceMachine", "mac"), 
    Restrictions.eq("sourceMachinePublic", "mac"));

    按条件查询

    可以根据需要构建各种条件,并将其传递给按条件查询方法。此方法可以接受 Java varargs 允许的任意数量的限制条件。

    // Find By Criteria
    RAudit audit = rm.getByCriteria(RAudit.class, Restrictions.eq
    ("sourceMachine", "mac"), Restrictions.eq("sourceMachineId", "23-A"));
    System.out.println(audit.getSourceMachine());

    按 HQL 查询

    按 HQL 查询是通过 getByHQL 方法实现的,参数在哈希图中指定(参数名称和值)。

    // Find By HQL
    Map<String, Object> parameters = new HashMap<String, Object>();
    parameters.put("sa", "mac");
    RAudit audit2 = rm.getByHQL("FROM RAudit r 
    where r.sourceAddress = :sa", parameters, RAudit.class);
    System.out.println(audit2.getSourceMachine()); 

    许可证

    本文没有明确的许可证附加到它,但可能包含在文章文本或下载文件本身中的使用条款。如有疑问,请通过下面的讨论区联系作者。

    © . All rights reserved.