`
ch_space
  • 浏览: 109100 次
  • 性别: Icon_minigender_1
  • 来自: 农村进城务工人员
社区版块
存档分类
最新评论

hibernate学习笔记12---简化

阅读更多
fireflyc 写道

嘿嘿,这个帖子挺热。似乎javaeye上的这种帖子都很热。。。。。都要成框架生产基地了。每天都有伟大的东西诞生,不知道是喜还是忧。

看了一下楼主的想法,无非是根据tableName和类的属性生成SQL语句。这种做的原因无非是觉得hibernate是如何如何的差。其实事情没有那么糟糕,

 

如果说Hibernate差,那么楼主的东西比Hibernate更差。

 

楼主的东西也是一种根据Class推导出SQL语句的。而hibernate也是这样的。所以设计思想上是相通的。而楼主的做法不如hibernate的原因是因为,hibernate底层有不通的数据库SQL生成引擎(这个命名。。。呵呵),而且有二级缓存,关联查询,HQL查询语句等等功能。而比起楼主的做法要丰富的多。所以如果说Hibernate差那么楼主的做法比Hibernate更差。

 

楼主觉得Hibernate差的原因无非是因为“我们需要一个与StudentSchema类似的POJO类,一个DAO类,一个*.hbm.xml映射文件,才能达到类似的效果,机制繁琐,性能消耗明显要高。 ”事实果真如此吗?不尽然,不妨分析一下:

 

首先是需要一个POJO得javabean,里面到底要不要包含序列化得业务逻辑?如果包含,那么就是富领域对象了,如果不包含就是贫血对象了。而对于java开发人员来讲贫血的是更普遍的。数据承载对象由javabean的model负责,而业务逻辑有service负责。所以POJO类是一定需要的。至于DAO,完全可以省略了,我们只需要一个Service层就可以了。这里不妨引用一下我随手找大一些代码段

 

	public Page<SiteUser> findUserByPage(int pageno) {
		String hql = "FROM SiteUser siteUser";
		return siteUserDao.pagedQuery(hql, pageno, Constants.PAGE_SIZE);
	}

	public void saveUser(String userName) {
		SiteUser entity = new SiteUser();
		entity.setName(userName);
		entity.setSiteId(UUIDGenerator.generateUUID());
		entity.setPwd(MD5.crypt(entity.calPwdCode()));
		siteUserDao.save(entity);
	}

	public void updateUser(String userId, String userName) {
		SiteUser entity = siteUserDao.get(userId);
		entity.setName(userName);
		entity.setSiteId(UUIDGenerator.generateUUID());
		entity.setPwd(MD5.crypt(entity.calPwdCode()));
		siteUserDao.save(entity);
	}

	public SiteUser auth(String userName, String siteId) {
		String hql = "FROM SiteUser siteUser WHERE siteUser.name=? AND siteUser.siteId=?";
		return siteUserDao.findOne(hql, userName, siteId);
	}

 

这里的DAO其实是

private HibernateDao<SiteUser> siteUserDao;

 也就是所DAO层名存实亡了。

 

那么还有一个配置文件的问题,这个基本上不是问题,使用JPA的注解。最佳实践是尽量的少写JPA的注解,尽量默认。看我的注解对象

 

@Entity
public class SiteUser extends JPAModel {
	@Id
	private String id = UUIDGenerator.generateUUID();
	@Column
	private String name;
	@Column
	private String siteId;
	@Column
	private String pwd;
	@Column
	private Date addDate = new Date();

 只需要在spring里的sessionFactory定义一下

 

<property name="namingStrategy">
	<bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
</property>

 就会完成名称的“约定大于配置”

 

如此,这些事情也不再繁琐了。得到的好处也是显而易见的了:我们能使用hibernate的save,update,deleteById等基本操作,书写HQL语句要比书写SQL语句更短一点更容易理解一点。现在Hibernate才是被我们玩而不是我们被它玩了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics