我的问题更多的是关于如何与Google App Engine实现无主关系的最佳实践问题。我正在使用JDO来执行我的持久性,并像谷歌文档中推荐的那样我坚持我的无主义关系列表如下:
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class User implements Serializable, UserDetails {
...
@Persistent
private List<Key> groups;
...
}
当我使用Key对象查询对象列表时,我遇到了困境。因此,当我获得组密钥列表以便实际返回组对象列表时,我必须查看该密钥以获取对象。我的问题是在模型对象上进行无主查找的推荐方法是什么?
我的Model对象上是否应该有PersistanceManagerFactory的实例,以便我可以进行查找?
我的Model对象上是否应该有GroupDAO对象的实例,以便查看?
我是否应该使用Utility来执行此类查找?
我是新手,所以我只想知道哪种方法最好。感谢。
答案 0 :(得分:1)
Google recommends创建单身PersistenceManagerFactory。我不会在你的模型中贴上PMF。
答案 1 :(得分:1)
理想情况下,User
对象将有一个返回List<UnownedObject>
的方法,以便调用者获得一个干净的API。一种方法是让User
对象拥有DAO的实例,这样它就可以让DAO进行查询。
为了做到这一点,PersistenceManager
在请求结束前无法关闭。一种方法是创建servlet filter:
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 to use Guice。
这只是一种可行的方法。如果providePersistenceManager
创建PersistenceManager
并将其存储为请求属性而不是让servlet过滤器创建PersistenceManager
(过滤器仍将关闭它),您可能会更聪明。您还可以让servlet过滤器获取Guice Injector,这样您就可以避免使用setAttribute()
和getAttribute()
,而是使用更加类型安全的API。