理想情况下,该User
对象应该有一个返回 a 的方法,List<UnownedObject>
以便调用者获得一个干净的 API。一种方法是让User
对象拥有 DAO 的实例,以便它可以要求 DAO 进行查询。
为了做到这一点,PersistenceManager
直到请求结束才能关闭。一种方法是创建一个servlet 过滤器:
public class PersistenceManagerFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
request.setAttribute("pm", pm);
chain.doFilter(request, response);
} finally {
pm.close();
}
}
}
然后你可以将它PersistenceManager
注入你的 DAO。如果你使用Guice,你可以这样做:
@RequestScoped
public class UserDao {
private final PersistenceManager pm;
@Inject
UserDao(PersistenceManager pm) {
this.pm = pm;
}
public User getUser(parameters) {
Key key = createKey(parameters);
User user = pm.getObjectById(User.class, key);
user.setUserDao(this);
return user;
}
}
这在与包范围UserDao
相同的包中User
时效果最佳。User.setUserDao()
您可以决定将 设置PersistenceManager
为User
对象而不是UserDao
.
接下来,您需要创建一个 Guice 模块来绑定PersistenceManager
:
public class PersistenceManagerModule extends AbstractModule {
@Override
protected void configure() {
}
@Provides @RequestScoped
PersistenceManager providePersistenceManager(HttpServletRequest request) {
return (PersistenceManager) request.getAttribute("pm");
}
}
最后,您需要配置Google App Engine 以使用 Guice。
这只是一种可能的方法。您可能更聪明的是providePersistenceManager
创建PersistenceManager
并将其存储为请求属性,而不是让 servlet 过滤器创建PersistenceManager
(过滤器仍会关闭它)。您还可以让 servlet 过滤器获取 Guice Injector,这样您就可以避免使用setAttribute()
,getAttribute()
而是使用更安全的 API。