首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring3和Hibernate4中的长事务会话

Spring3和Hibernate4中的长事务会话
EN

Stack Overflow用户
提问于 2013-08-19 19:38:29
回答 1查看 58关注 0票数 0

在下面的场景中,我获得了LazyInitializationException到Shop.events集合。

我知道问题可能在调用shop.getEvents之前就关闭了。

我当时正在学习OpenSessionInViewFilter,但我认为在每次调用服务器的过程中,每个事务会话都不是一个好主意。FetchType.EAGER也不太好。

我需要帮助来解决这个问题。提前谢谢你。

代码语言:javascript
复制
@Entity
@Table(name = "shop")
public class Shop implements Serializable {

    // Another class attributes.    

    @OneToMany(mappedBy = "shop", fetch=FetchType.LAZY)
    private Set<Event> events;

    // Getters and setters.

}

代码语言:javascript
复制
@Entity
@Table(name = "event")
public class Event implements Serializable {

    // Another class attributes.

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "shop_id", nullable = false)
    private Shop shop;

    // Getters and setters.

}

持久层实现。

代码语言:javascript
复制
public interface AbstractDao<E, I extends Serializable> {

    E findUniqueByCriteria(Criteria criteria);

}

代码语言:javascript
复制
public interface ShopDao extends AbstractDao<Shop, String>{

    Shop getShopFromId(int shop_id, int manager_id);

}

代码语言:javascript
复制
@Repository("shopDao")
public class ShopDaoImpl extends AbstractDaoImpl<Shop, String> implements ShopDao {

    protected ShopDaoImpl() {

        super(Shop.class);
    }

    @Override
    public Shop getShopFromId(int shop_id, int manager_id) {

        Criteria criteria = this.getCurrentSession().createCriteria(Shop.class)
                .add(Restrictions.and(
                Restrictions.like("active", true),
                Restrictions.like("id", shop_id)))
                .createCriteria("manager").add(
                Restrictions.like("id", manager_id));

        return (Shop) this.findUniqueByCriteria(criteria);
    }

}

代码语言:javascript
复制
public interface ShopService {

    Shop getShopFromId(int shop_id, int manager_id);

}

代码语言:javascript
复制
@Service("shopService")
@Transactional(readOnly = true)
public class ShopServiceImpl implements ShopService {

    @Autowired
    private ShopDao shopDao;

    @Override
    public Shop getShopFromId(int shop_id, int manager_id) {

        return this.shopDao.getShopFromId(shop_id, manager_id);
    }

}

控制器看起来是这样的。

类属性。

代码语言:javascript
复制
@Autowired
private ShopService shopService;

方法控制器

代码语言:javascript
复制
Manager manager = (Manager) request.getSession(false).getAttribute("manager");

Shop shop = (Shop) this.shopService.getShopFromId(shop_id, manager.getId());

Set<Event> events = shop.getEvents();
EN

回答 1

Stack Overflow用户

发布于 2013-08-19 21:24:29

解决方案是使用@Transactional(传播= Propagation.REQUIRED)的Controller方法。因此,在方法持久性操作中使用相同的事务会话。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18321752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档