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

Struts2.12+Spring3.2+hibernate4.2集成2

    博客分类:
  • SSH
阅读更多

1.在上一章我们把springhibernate已经整合了,接下来验证一下是否整合成功。

2.在项目中添加一个实体类User

package com.lysoft.bean.user;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "t_user")
public class User implements Serializable {
	private static final long serialVersionUID = 4239100106344646509L;
	private Integer id;
	private String userName;
	private String firstName;
	private Date createTime;

	@Id @GeneratedValue
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	@Column(length = 50, nullable = false)
	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	@Temporal(TemporalType.TIMESTAMP)
	public Date getCreateTime() {
		return createTime;
	}

	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}

}

3. 为了项目简化项目的CRUD,抽取出通用的接口来进行操作。

Dao层代码

package com.lysoft.dao.base;

import java.io.Serializable;
import java.util.List;

/**
 * 通用Dao接口
 * @author liang
 * @param <T> 实体对象
 * @param <PK> 主键
 */
public interface IBaseDao<T extends Serializable, PK extends Serializable> {
	/**
	 * 保存实体
	 * @param entity
	 */
	public void add(T entity);
	
	/**
	 * 删除实体
	 * @param ids
	 */
	public void delete(PK... ids);
	
	/**
	 * 更新实体
	 * @param entity
	 */
	public void update(T entity);
	
	/**
	 * 添加或更新实体
	 * @param entity
	 */
	public void addOrUpdate(T entity);
	
	/**
	 * 查询实体, 使用load方式, 支持延迟加载
	 * @param id
	 * @return
	 */
	public T find(PK id);
	
	/**
	 * 查询实体, 使用get方式, 不支持延迟加载
	 * @param id
	 * @return
	 */
	public T get(PK id);
	
	/**
	 * 查询实体, 使用load方式, 支持延迟加载
	 * @param id
	 * @return
	 */
	public T load(PK id);
	
	/**
	 * 获取记录总数
	 * @return
	 */
	public Long getCount();
	
	/**
	 * 查询所有实体
	 * @return
	 */
	public List<T> listAll();

	/**
	 * 执行SQL 放入一级缓存
	 */
	public void flush();
	
	/**
	 * 从一级缓存中清楚某个对象
	 * @param entity
	 */
	public void evict(T entity);
	
	/**
	 * 清理一级缓存
	 */
	public void clear();	

}

 

package com.lysoft.dao.base.hibernate;

import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.lysoft.dao.base.IBaseDao;

public abstract class BaseHibernateDao<T extends Serializable, PK extends Serializable> implements IBaseDao<T, PK> {
	
	private Class<T> entityClass;
	
	@Resource
	private SessionFactory sessionFactory;
	
	public Session getSession() {
		return sessionFactory.getCurrentSession();
	}
	
	@PostConstruct
    @SuppressWarnings("unchecked")
    public void init() {
		//getClass()是多态的,指的是运行期间的对象所属的类型
		//如:UserDaoImpl extends BaseHibernateDao 即运行期间getClass()的类型是UserDaoImpl
        this.entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

	@Override
	public void add(T entity) {
		getSession().save(entity);
	}

	@Override
	public void delete(PK... ids) {
		if (null != ids) {
			for (Serializable id : ids) {
				getSession().delete(getSession().load(entityClass, id));
			}
		}
	}
	
	public void addOrUpdate(T entity) {
		getSession().saveOrUpdate(entity);
	}

	@SuppressWarnings("unchecked")
	@Override
	public T find(PK id) {
		return (T) getSession().load(entityClass, id);
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public T get(PK id) {
		return (T) getSession().get(entityClass, id);
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public T load(PK id) {
		return (T) getSession().load(entityClass, id);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<T> listAll() {
		return getSession().createQuery("from " + getEntityName(entityClass)).list();
	}

	@Override
	public void update(T entity) {
		getSession().update(entity);
	}

	@Override
	public Long getCount() { 
		return (Long)getSession().createQuery("select count(" + getCountField(entityClass) + ") from " + getEntityName(entityClass) + " as o").uniqueResult();
	}
	
	@Override
	public void clear() {
		getSession().clear();
	}

	@Override
	public void evict(T entity) {
		getSession().evict(entity);
	}

	@Override
	public void flush() {
		getSession().flush();
	}
	
	/**
	 * 获取实体类名称
	 * @param <E>
	 * @param entityClass
	 * @return
	 */
	private static <E> String getEntityName(Class<E> entityClass) {
		String entityName = entityClass.getSimpleName();
		Entity entity = entityClass.getAnnotation(Entity.class);
		//如果实体类Entity注解上面重命名了实体名称
		if (null != entity.name() && !"".equals(entity.name())) {
			entityName = entity.name();
		}
		return entityName;
	}
	
	/**
	 * 获取统计属性,该方法是为了解决hibernate解析联合主键select count(o) from Xxx o
	 * 语句BUG而增加,hibernate对此hql解析后的sql为select count(field1,field2,...),显示使用count()统计多个字段是错误的
	 * @param <E>
	 * @param clazz
	 * @return
	 */
	private static <E> String getCountField(Class<E> clazz) {
		String out = "o";
		try {
			PropertyDescriptor[] propertyDescriptors = Introspector.getBeanInfo(clazz).getPropertyDescriptors();
			for (PropertyDescriptor propertydesc : propertyDescriptors) {
				Method method = propertydesc.getReadMethod();
				if (method != null && method.isAnnotationPresent(EmbeddedId.class)) {					
					PropertyDescriptor[] ps = Introspector.getBeanInfo(propertydesc.getPropertyType()).getPropertyDescriptors();
					out = "o."+ propertydesc.getName()+ "." + (!ps[1].getName().equals("class") ? ps[1].getName() : ps[0].getName());
					break;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
        return out;
	}

}

 Service层代码

package com.lysoft.service.base;

import java.io.Serializable;
import java.util.List;

/**
 * 通用Service接口
 * @author liang
 * @param <T> 实体对象
 * @param <PK> 主键
 */
public interface IBaseService<T extends Serializable, PK extends Serializable>  {
	/**
	 * 保存实体
	 * @param entity
	 */
	public void add(T entity);
	
	/**
	 * 删除实体
	 * @param ids
	 */
	public void delete(PK... ids); 
	
	/**
	 * 更新实体
	 * @param entity
	 */
	public void update(T entity);
	
	/**
	 * 添加或更新实体
	 * @param entity
	 */
	public void addOrUpdate(T entity);
	
	/**
	 * 查询实体, 使用load方式, 支持延迟加载
	 * @param id
	 * @return
	 */
	public T find(PK id);
	
	/**
	 * 查询实体, 使用get方式, 不支持延迟加载
	 * @param id
	 * @return
	 */
	public T get(PK id);
	
	/**
	 * 查询实体, 使用load方式, 支持延迟加载
	 * @param id
	 * @return
	 */
	public T load(PK id);
	
	/**
	 * 获取记录总数
	 * @return
	 */
	public Long getCount();
	
	/**
	 * 查询所有实体
	 * @return
	 */
	public List<T> listAll();
	
	/**
	 * 执行SQL 放入一级缓存
	 */
	public void flush();
	
	/**
	 * 从一级缓存中清楚某个对象
	 * @param entity
	 */
	public void evict(T entity);
	
	/**
	 * 清理一级缓存
	 */
	public void clear();
	
}

 

package com.lysoft.service.base.impl;

import java.io.Serializable;
import java.util.List;

import javax.annotation.Resource;

import com.lysoft.dao.base.IBaseDao;
import com.lysoft.service.base.IBaseService;

public abstract class BaseServiceImpl<T extends Serializable, PK extends Serializable> implements IBaseService<T, PK> {

	@Resource
	protected IBaseDao<T, PK> hibernateDao;

	@Override
	public void add(T entity) { 
		hibernateDao.add(entity);
	}
 
	@Override
	public void delete(PK... ids) {
		hibernateDao.delete(ids);
	} 
	
	public void addOrUpdate(T entity) {
		hibernateDao.addOrUpdate(entity);
	}

	@Override
	public T find(PK id) {
		return hibernateDao.find(id);
	}
	
	@Override
	public T get(PK id) {
		return hibernateDao.get(id);
	}
	
	@Override
	public T load(PK id) {
		return hibernateDao.load(id);
	}

	@Override
	public Long getCount() {
		return hibernateDao.getCount();
	}

	@Override
	public List<T> listAll() {
		return hibernateDao.listAll();
	}

	@Override
	public void update(T entity) {
		hibernateDao.update(entity);
	}
	
	@Override
	public void clear() {
		hibernateDao.clear();
	}

	@Override
	public void evict(T entity) {
		hibernateDao.evict(entity);
	}

	@Override
	public void flush() {
		hibernateDao.flush();
	}
	
}

 4. junit测试, 需要加入jar包 junit-4.11.jar  hamcrest-core-1.3.jar  hamcrest-library-1.3.jar

package com.lysoft.service.user.impl;

import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertThat;

import java.util.Date;

import javax.annotation.Resource;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

import com.lysoft.bean.user.User;
import com.lysoft.service.user.UserService;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext-*.xml")
@Transactional
public class UserServiceImplTest {

	@Resource
	private UserService userService;
	private User user;
	private int userId;
	
	@Before
	public void initData() {
		user = new User();
		userId = 20633;
		user.setId(userId);
		user.setUserName("20130339");
		user.setFirstName("张三");
		user.setCreateTime(new Date());
	}
	
	@Test
	public void testAdd() {
		userService.add(user);
		User u = userService.find(userId);
		assertThat(u, notNullValue());
		
		userService.delete(userId);
		u = userService.get(userId);
		assertThat(u, nullValue());
	}

	@Test
	public void testDelete() {
		userService.add(user);
		User u = userService.find(userId);
		assertThat(u, notNullValue());
		
		userService.delete(userId);
		u = userService.get(userId);
		assertThat(u, nullValue());
	}

	@Test
	public void testFind() {
		userService.add(user);
		User u = userService.find(userId);
		assertThat(u, notNullValue());
		
		userService.delete(userId);
		u = userService.get(userId);
		assertThat(u, nullValue());
	}

	@Test
	public void testGet() {
		userService.add(user);
		User u = userService.find(userId);
		assertThat(u, notNullValue());
		
		userService.delete(userId);
		u = userService.get(userId);
		assertThat(u, nullValue());
	}

	@Test
	public void testLoad() {
		userService.add(user);
		User u = userService.find(userId);
		assertThat(u, notNullValue());
		
		u = userService.load(userId);
		assertThat(u, notNullValue());
		
		userService.delete(userId);
		u = userService.get(userId);
		assertThat(u, nullValue());
	}

	@Test
	public void testGetCount() {
		userService.add(user);
		User u = userService.find(userId);
		assertThat(u, notNullValue());
		
		long count = userService.getCount();
		assertThat(count, greaterThan(0L));
		
		userService.delete(userId);
		u = userService.get(userId);
		assertThat(u, nullValue());
	}

	@Test
	public void testUpdate() {
		userService.add(user);
		
		User u = userService.find(userId);
		u.setUserName(u.getUserName() + "modify");
		userService.update(u);
		
		userService.delete(userId);
		u = userService.get(userId);
		assertThat(u, nullValue());
	}

}

5.在数据库中手动创建一个库,名称叫ssh2,并修改spring 配置文件中数据源的数据库名称.

6.运行UserServiceImplTest 类当中的testAdd方法,测试通过,会在数据库中生成一张t_user表。我测试了这个类中的所有方法都通过测试。

 

 

 

 

分享到:
评论
2 楼 blue_1110 2013-07-16  
如何这些代码中,写入了其他的serviceImpl,就会报错
1 楼 sunlongan666 2013-05-23  
缺少UserService,望楼主不全

相关推荐

Global site tag (gtag.js) - Google Analytics