Generic Hibernate DAO
Posted
技术标签:
【中文标题】Generic Hibernate DAO【英文标题】: 【发布时间】:2011-10-10 17:47:26 【问题描述】:如果有人可以提供帮助,我们将不胜感激。
我的计划是有两层。一是服务层,二是DAO层。服务层做业务逻辑,DAO层做CRUD数据操作。
有两个名为 Person 和 Order 的休眠实体。这两个实体实现了一个 BaseEntity 接口。想在DAO层写一个泛型方法,让它可以取任何实体。
关于如何编写通用 dao 方法的任何建议?
@Entity
@Table(name = "PERSON")
public class Person implements BaseEntity, java.io.Serializable
private int id;
private String firstName;
public Person()
@Id
@Column(name = "PERSON_ID")
@GeneratedValue(strategy = GenerationType.AUTO)
public int getId()
return id;
public void setId(int id)
this.id = id;
@Column(name = "FIRST_NAME", nullable = false, length = 50)
public String getFirstName()
return firstName;
public void setFirstName(String firstName)
this.firstName = firstName;
@Entity
@Table(name = "PURCHASE_ORDER")
public class Order implements BaseEntity java.io.Serializable
private int id;
public Order()
@Id
@Column(name = "ORDER_ID")
@GeneratedValue(strategy = GenerationType.AUTO)
public int getId()
return id;
public void setId(int id)
this.id = id;
@Transient
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
public Set<OrderItem> getOrderItems()
return orderItems;
public void setOrderItems(Set<OrderItem> orderItems)
this.orderItems = orderItems;
您能否建议如何创建一个应该将 Person 或 Order 实体作为输入参数的通用方法?
【问题讨论】:
【参考方案1】:这里是an article on writing a reusable generic DAO class。
【讨论】:
+1 好文章。让我不必带出代码来演示 hibernate 团队还写了一篇关于通用 DAO 的文章 community.jboss.org/wiki/GenericDataAccessObjects 以及一些托管在 Google Code code.google.com/p/hibernate-generic-dao 上的自定义解决方案,现在我们在项目中使用 Gochev Naiden 的方法 gochev.blogspot.com/2009/08/hibernate-generic-dao.html 【参考方案2】:让 Person 和 Order 子类化一个基础 DAO,让方法接受 DAO。
【讨论】:
感谢您的帮助。但它不明白。让我在这里给出我的代码,以便您进一步提出建议。 我读对了吗 - 你建议实体对象扩展 DAO?【参考方案3】:这是编写通用 fetch 方法的方式:
public <T> T get(long id,Class<T> clazz) throws Exception
Session session = null;
T t=null;
try
session=getSessionFactory().openSession();
t= (T) session.get(clazz.getCanonicalName(),id);
catch(Exception e)
throw e;
finally
if(session!=null) session.close();
return t;
忽略异常处理。使用您自己的异常处理技术。
【讨论】:
您可能会考虑通用主键类型,就像@Nathan Hughes 在您的回答前 2 小时提到的文章中所建议的那样。 是的..我应该这样做..以容纳复合键..这就像一场噩梦..废话..该死的可扩展接口!以上是关于Generic Hibernate DAO的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate Generic DAO - 测试生成的 SQL 是不是正确
getCurrentSession() 与 openSession()
尝试使用 EhCache 使用 Spring 和扩展 Hibernate 的 JpaRepository 的自定义 GenericDao 接口