您可以使用几种替代方法:
使用级联持久性:
@oneToMany(fetch=FetchType.LAZY, mappedBy="user", cascade = {CascadeType.PERSIST})List<OAuthLogin> oauthLogins;在您的Servlet中执行以下操作:
User user = new User(name);user.setEmail(email);OAuthLogin fbLogin = new OAuthLogin(user, OAuthProvider.FACEBOOK, "1501791394"); user.getOauthLogins().add(fbLogin) // this is enough assuming uni-directional associationuserDAO.persist(user);List<OAuthLogin> oauthLogins = user.getOauthLogins();
这样就可以了,加上您只有一个事务,并且JDBC调用更少。
这对于特定的Servlet方法调用的特定用例很有帮助。
EJB中的预取集合
public User findById(int id, boolean prefetch) { User entity = em.find(User.class, id); if (prefetch) { // Will trigger 1 or size JDBC calls depending on your fetching strategy entity.getOauthLogins().size() } return entity;}或者,使用条件覆盖获取模式
这对于您想要在保留a
OAuthLogin的
User同时获取集合的每种情况都很有帮助,
FetchType.LAZY并且避免
LazyInitializationException仅针对该特定集合。
在视图过滤器中使用打开实体管理器
只是Google,您会发现很多例子
基本上
LazyInitializationException,这将防止每个懒惰获取的每个关联,每个跨整个实体的应用程序
PS:
- 如果不使用Spring,为什么要使用
@Transactional
(默认情况下,它甚至不适用于HttpServlet
) - 它可能已使用某种量身定制的解决方案为WebLogic工作



