Hibernate关于的Timestamp的问题

计算商品的点击次数的需求

1、更新商品的点击次数
2、并且返回当前商品

问题描述:
当执行完操作后
private Timestamp pushDate; //入库时间(import java.sql.Timestamp;)
这个映射字段每次都会被重置为当前时间,譬如 2015-12-25 16:27:49


原因:
一个session里面是有实体的生命周期的,在这个周期内,实体的所有值得变化都会反映到数据库里面,最后事物提交了就会出问题。
解决办法:分开写两个业务,一个增加点击量,一个返回详情;用hibernate更新的时候最好先查询出来这个实体,然后对实体设置变化值,
最后更新到数据库,这样可以避免很多问题。

余留问题:
直接书写sql语句,对于Timestamp类型的映射值来说还是会出问题,就是这一点不懂,还望大大解答。

原来的代码:
@Override
	public Goods getExgProductContent(String gid) {
		Session session = hib.getSession();
		Transaction tx=session.beginTransaction();
		try{
			Goods goods=(Goods) session.get(Goods.class, gid);
			//更新点击次数
			String sql="update tablename set click_count=:clickCount where g_id=:gid";
			Query query=session.createSQLQuery(sql);
			query.setParameter("gid", gid);
			query.setParameter("clickCount", goods.getClickCount()+1);
			query.executeUpdate();
			tx.commit();
			return goods;
		}catch(Exception e){
//			e.getMessage();
			KeyhuaLogger.logger.debug(e.getMessage());
			tx.rollback();
			return null;
		}finally{
			if(null!=session) session.close();
		}
		
	}


修改后的代码:


@Override
	public Goods getExgProductContent(String gid) {
		Session session = hib.getSession();
		try{
			//得到商品
			Goods goods=(Goods)session.createSQLQuery("select * from tablename where g_id=?").addEntity(Goods.class).setString(0, gid).uniqueResult();
			return goods;
		}catch(Exception e){
			e.printStackTrace();
			return null;
		}finally{
			if(null!=session) session.close();
		}
		
	}
	
	@Override
	public void addClickCount(String gid) {
		Session session = hib.getSession();
		Transaction tx=session.beginTransaction();
		try{
			//更新点击次数
			Goods goods=(Goods) session.get(Goods.class, gid);
			goods.setClickCount(goods.getClickCount()+1);
			session.save(goods);
			tx.commit();
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(null!=session) session.close();
		}
		
	}


你可能感兴趣的:(Java,hibernate,java,timestamp)