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 是不是正确

Spring Generic Dao 类名

getCurrentSession() 与 openSession()

尝试使用 EhCache 使用 Spring 和扩展 Hibernate 的 JpaRepository 的自定义 GenericDao 接口

不使用 Spring 获取 EntityManager

spring Transactional