`
Icgemu
  • 浏览: 71153 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

hibernate中对任何Entity通用的Dao方法

    博客分类:
  • Java
阅读更多
使用Hibernate不是很久,自己在边学习的过程中发现如果要每增加一个Entity就要实现一个DAO和DaoImp的话会比较麻烦,所以自己就写了下面这两个类来实现了对所有Entity通用的操作。

首先写一个 Dao  interface:
package com.cennavi.dao;

public interface Dao<T> {
	public void add(T a );
	public T find(Class<T> t,int id);
	public void delete(T t);
	public void update(T t);
}



使用泛型,把需要使用Dao的Entity抽象为T;

然后写一个实现类 DaoImp.class:

package com.cennavi.daoImp;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.cennavi.dao.Dao;
import com.cennavi.factory.HibernateSessionFactory;

public class DaoImp<T> implements Dao<T> {
	public Session sf=HibernateSessionFactory.getSession();
	
	@Override
	public void add(T obj) {
		Transaction ts=sf.beginTransaction();
		ts.begin();
		sf.save(obj);
		ts.commit();
	}

	@Override
	public void delete(T obj) {		
		Transaction ts=sf.beginTransaction();
		ts.begin();
		sf.delete(obj);
		ts.commit();
	}

	@SuppressWarnings("unchecked")
	@Override
	public T find(Class<T> t,int id) {
		Transaction ts=sf.beginTransaction();
		T obj=(T)sf.get(t, id);
		ts.commit();
		return obj;
	}

	@Override
	public void update(T obj) {
		Transaction ts=sf.beginTransaction();
		ts.begin();
		sf.saveOrUpdate(obj);
		ts.commit();
	}

}


当然没有完全泛型化,如find方法中的id.同时HibernateSessionFactory为一个sessionFactory的提供者。

下面是一个测试Entity
package com.cennavi.pojo;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class User implements Serializable {
	private static final long serialVersionUID = 1186025505012915442L;
	
	@Id
	@GeneratedValue
	private int id;
	private String name;
	private String snn;
	
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSnn() {
		return snn;
	}
	public void setSnn(String snn) {
		this.snn = snn;
	}
}


采用注解方法来注册Entity
下面类简单测试:

package com.cennavi.client;

import com.cennavi.dao.Dao;
import com.cennavi.daoImp.DaoImp;
import com.cennavi.pojo.BigUser;
import com.cennavi.pojo.User;

public class UserDaoImpTest {

	public static void main(String[] args) {
		Dao<User> dao=new DaoImp<User>();
		
		User user=new User();
		user.setName("roan");
		user.setSnn("1111111111111111111111");
		
		dao.add(user);
	}

}



以上只是为自己测试学习之用,比较简单。后来查找网络发现已经有完整的模版DAO,仅供参考罢了.
有了这个方法,自己学习起来速度当然加快拉,有了更多的时间去看书,不被重复的代码占用时间。
分享到:
评论
1 楼 Niklai 2009-09-17  
通用dao的想法是好的,对单个实体的操作也许行得通
但是在查询上不一定通用
查询很有可能会用上HQL语句,楼主对这种查询还没写出通用语句

另外如果涉及到多表关联的话,可能就更复杂一些了,楼主需要考虑得更全面一些

相关推荐

Global site tag (gtag.js) - Google Analytics