如何使用 Hibernate Context 会话创建通用 DAO 类

2024-03-04

我正在尝试使用 Hibernates Context Sessions 实现通用 DAO。以下是我的镜头:|

import java.io.Serializable;

public interface GenericDao<T, ID extends Serializable> {

 /** Persist the newInstance object into database */
 ID create(T newInstance);

 /**
  * Retrieve an object that was previously persisted to the database using
  * the indicated id as primary key
  */
 T read(ID primaryKey);

 /** Save changes made to a persistent object. */
 void update(T transientObject);

 /** Remove an object from persistent storage in the database */
 void delete(T persistentObject);
}


import java.io.Serializable;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.transaction.annotation.Transactional;

@Transactional
@SuppressWarnings("unchecked")
public class GenericDaoImpl<T, ID extends Serializable> implements
  GenericDao<T, ID> {
 private SessionFactory sessionFactory;

 public void setSessionFactory(final SessionFactory sessionFactory) {
  this.sessionFactory = sessionFactory;
 }

 @Override
 public ID create(final T newInstance) {
  ID id = null;
  final Session session = sessionFactory.openSession();
  final Transaction tx = session.beginTransaction();
  try {
   id = (ID) session.save(newInstance);
   tx.commit();
   session.close();
  } catch (final Exception e) {
   if (tx != null) {
    tx.rollback();
   }
   e.printStackTrace();
  } finally {
   if (session.isOpen()) {
    session.close();
   }
  }
  return id;
 }

 @Override
 public T read(final ID primaryKey) {
  T id = null;
  final Session session = sessionFactory.openSession();
  final Transaction tx = session.beginTransaction();
  try {
   id = (T) session.get(T, primaryKey);
   tx.commit();
   session.close();
  } catch (final Exception e) {
   if (tx != null) {
    tx.rollback();
   }
   e.printStackTrace();
  } finally {
   if (session.isOpen()) {
    session.close();
   }
  }
  return id;
 }

 @Override
 public void update(final T transientObject) {
  final Session session = sessionFactory.openSession();
  final Transaction tx = session.beginTransaction();
  try {
   session.saveOrUpdate(transientObject);
   tx.commit();
   session.close();
  } catch (final Exception e) {
   if (tx != null) {
    tx.rollback();
   }
   e.printStackTrace();
  } finally {
   if (session.isOpen()) {
    session.close();
   }
  }
 }

 @Override
 public void delete(final T persistentObject) {
  final Session session = sessionFactory.openSession();
  final Transaction tx = session.beginTransaction();
  try {
   session.delete(persistentObject);
   tx.commit();
   session.close();
  } catch (final Exception e) {
   if (tx != null) {
    tx.rollback();
   }
   e.printStackTrace();
  } finally {
   if (session.isOpen()) {
    session.close();
   }
  }
 }
}

应用上下文:

<bean id="domainDao" class="com.foo.dao.DomainDao">
  <property name="sessionFactory">
   <ref bean="sessionFactory"></ref>
  </property>

 </bean>

 <bean id="domainDao2" class="com.foo.dao.GenericDaoImpl">
  <property name="sessionFactory">
   <ref bean="sessionFactory"></ref>
  </property>

 </bean>
 <tx:annotation-driven transaction-manager="txManager" />


 <bean id="txManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory" />
 </bean>

我们的应用程序是一个新的应用程序,我们正在尝试使用 Spring 3.0.3 和 Hibernate 3.5.5 来实现。

Q1.虽然我确实实现了它并且正在工作,但我是否以正确的方式做?

Q2。我该如何实施find()使用泛型进行操作?

id = (T) session.get(T, primaryKey);

这一行给出了编译错误。

UPDATE: 错误是因为第一个参数的类型Class.

public Object get(Class clazz, Serializable id)
           throws HibernateException

Q3。如何转换T to T.class?


在泛型 DAO 类中经常使用以下技巧来访问实际子类的类型参数:

public abstract class GenericDAO<T, ID extends Serializable> {  
    private Class<T> persistentClass;  
    ...

    @SuppressWarnings("unchecked")
    public GenericDAO() {
        this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

    public T get(ID id) {
        return (T) session.get(persistentClass, id);
    }

    ...
}

以及实际的 DAO 子类:

public class FooDAO extends GenericDAO<Foo, Long> {}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Hibernate Context 会话创建通用 DAO 类 的相关文章

随机推荐

  • iOS应用程序不会死,退出后写入控制台并播放声音

    我的应用程序有某种僵尸问题 不是 NSZombie 问题 就像是死而复生的问题 我首先注意到 在调试会话之后 当我去跑步时 iPhone 上的音乐会每隔约 7 分钟暂停一次 当我解锁设备时 应用程序名称会在状态栏中闪烁红色 就好像它正在运行
  • 现代如何使用汇编(例如 C/C++)?

    我了解计算机如何按照基本原理工作 例如 可以用 C C 等 高级 语言编写程序 然后将其分解为目标代码 然后分解为二进制代码以供处理器理解 然而 我真的很想了解汇编 以及它如何在现代应用程序中使用 我知道处理器在基本 x86 指令集之上有不
  • 使用 python 进行动态时间扭曲(最终映射)

    我需要对齐两个声音信号 以便将一个声音信号映射到另一个声音信号 两个信号对应相同的行为 我尝试从以下位置实现 python 代码 https nipunbatra github io blog 2014 dtw html https nip
  • multipart/form-data 可以用 javascript 发送吗?

    我使用以下形式通过 POST 发送文件以及文本 名称
  • casper.js 中的 setInterval 和 this.wait

    我需要做一个循环每次迭代之间间隔 3 次 2 秒 我尝试了以下 3 个选项 Option 1 var casper require casper create verbose false logLevel debug casper star
  • 如何让 OpenCover 查看本地 bin\Debug 文件夹中的 PDB 而不是 GAC

    我正在使用 OpenCover 4 7 922 和 nUnit 控制台运行程序 3 10 0 我有一个myproj tests测试的项目myproj 建成后 myproj tests bin debug包含myproj tests dll
  • 调用soap webservice从带有轴的java客户端返回对象列表

    我对网络服务感到恼火 我有一个非常简单的肥皂网络服务 Remote public interface StudentService public String sayHello public List
  • 无法创建 MoveConstructibles 地图

    我有一堂课包含std unique ptr lt gt 我想把这个类的实例放在一个std map lt gt 我认为推动 C 引入移动语义的原因之一是可以将诸如unique ptrs在标准容器内 对于向量而言 这确实有效 但在我看来std
  • 用于安装/升级 .NET Core 的命令行

    是否有用于安装或升级 NET Core 的命令行命令 我使用以下命令检查我的计算机上是否安装了 NET Coredotnet version只是注意到我的计算机上仍然安装了预览版本 我想知道是否可以发出一些命令将其升级到最新版本 没有dot
  • 普通对象 VS 模型对象的类实例

    在 Angular TypeScript 中创建模型对象的最佳实践是什么 我应该使用带有对象表示法的类型注释 对象是Object E g let m MyModel name foo 我应该使用new运算符 对象是各自原型的实例 这两种方法
  • Git - 冲突(重命名/删除)是什么意思?

    我在理解其他问题中的含义方面没有取得多大成功 这是一个 Ruby on Rails 项目 如果您知道该怎么做 这可能非常简单 我尝试合并两个分支 这是结果的 部分 CONFLICT rename delete db migrate 2016
  • 如何找到预告片字典?

    浏览 PDF 规范 它说trailer之前的startxref 对我来说 这意味着xref可以出现在文档中的任何位置 但是trailer仍然出现在startxref 在您必须解析它之前 这是有意义的 因为您必须反向解析 您无法考虑注释或字符
  • 行分隔的 json 序列化和反序列化

    我正在使用 JSON NET 和 C 5 我需要将对象列表序列化 反序列化为行分隔的 json http en wikipedia org wiki Line Delimited JSON http en wikipedia org wik
  • Java中如何通过代理发送HTTPS请求?

    我正在尝试使用 HttpsUrlConnection 类向服务器发送请求 服务器存在证书问题 因此我设置了一个信任所有内容的 TrustManager 以及一个同样宽松的主机名验证器 当我直接发出请求时 这个管理器工作得很好 但当我通过代理
  • fputcsv 不会在 CSV 文件中写入任何数据

    在我的网站中 我从 mysql 数据创建一个表 然后现在我想在表底部添加一个导出按钮 以便用户能够将数据下载为 CSV 文件 为此 我编写了虚拟表单
  • preg 匹配重复或增量字符

    我使用 preg match 来验证密码 preg match 5 password 它也接受特殊字符 但由于某种原因 我需要修改它应该接受 仅限字母数字 至少 5 个字符长 非常重要的是它不能有任何重复或 增量字符 例如 aaaa 或 1
  • 对各个页面的不同图像使用 Backstretch

    我希望有人可以提供帮助 我正在尝试使用 jQuery Backstretch 为 Bootstrap Wordpress 中的每个特定页面应用不同的背景图像 例如 主页 bg 图像 a 关于 bg 图像 b 新闻 bg 图像 c 等等 我已
  • 在自定义验证器指令中注入 ngControl 会导致循环依赖

    我正在尝试创建自定义 Angular 2 验证器指令 它像这样注入 NgControl Directive selector ngModel customValidator providers provide NG VALIDATORS u
  • 有关 CUDA 中统一虚拟寻址 (UVA) 的信息/示例

    我试图理解 CUDA 中统一虚拟寻址 UVA 的概念 我有两个问题 是否有任何示例 伪 代码可以演示这个概念 我在 CUDA C 编程指南中读到 UVA 只能在 64 位操作系统上使用 为什么会这样呢 A 统一虚拟地址空间 http doc
  • 如何使用 Hibernate Context 会话创建通用 DAO 类

    我正在尝试使用 Hibernates Context Sessions 实现通用 DAO 以下是我的镜头 import java io Serializable public interface GenericDao