问题描述
- 关于hibernate的一些疑问
-
@Override
public void update(T t) {
Session sess = sessionFactory.getCurrentSession();
sess.update(t);}
这个是我用spring+hibernate反向工程生成的一个DAO的函数,可以看到用了seesion,但是我不理解的是,为什么session在update后没有commit(),和close(),难道Hibernate希望我们在service层进行commit()和close()吗?
————————————————————————————————————————————————————-———
@Override
public void updateProductCount(int userId, int productModelId, int count) {
// TODO Auto-generated method stub
[color=#FF0000]User user = userDao.findByProperty("userId", userId);[/color]
[color=#FF0000]Cart cart = cartDao.findByProperty(CartDao.USER_ID, userId);[/color]String[] a1 = {CartDao.CART_ID, ProductModelDao.productModelId}; Integer[] a2 = {cart.getCartId(),productModelId}; [color=#FF0000]CartItem cartItem = cartItemDao.findListByProperties(a1,a2).get(0);[/color] cartItem.setCount(count); cartItemDao.update(cartItem); }
红色部分是3次查询,从代码来看是进行了3次getCurrentSession(),假设每一次的查询后seesion被自动关闭,这也就意味着seesion被反复打开关闭了3次吗?
如果我给这个函数加上一个事务@Transactional,那么是不是意味这一个事务跨了3连接,但是JDBC为底层的HIbernate不是不允许跨连接调用的吗?
我有打算过看源码,但是找不到。。。所以向大家求救————————————————————————————————————————————————————————
关于事务的属性是不是一般加给service层,因为DAO层都是最基本的操作了(增删查改),事务不是不是就是把一堆基本操作打包好的意思
————————————————————————————————————————————————————————
@Override
public void updateProductCount(int userId, int productModelId, int count) {
// TODO Auto-generated method stub
[color=#FF0000]User user = userDao.findByProperty("userId", userId);[/color]
[color=#FF0000]Cart cart = cartDao.findByProperty(CartDao.USER_ID, userId);[/color]String[] a1 = {CartDao.CART_ID, ProductModelDao.productModelId}; Integer[] a2 = {cart.getCartId(),productModelId}; [color=#FF0000]CartItem cartItem = cartItemDao.findListByProperties(a1,a2).get(0);[/color] cartItem.setCount(count); cartItemDao.update(cartItem); }
就这个函数而言,我如果加了那个openSessionInView的过滤器,是不是指在这个函数从开始调用到完成,session会一直保持打开状态,也就不会出现因为延迟加载访问不到对象的集合属性了啊?这样比seesion反复打开关闭的性能提升大不大啊
解决方案
Hibernate中 session.delete()疑问?