如何从google app engine中的GAE数据存储访问延迟加载的对象-JAVA JPA
我已经为一个问题挣扎了很长一段时间,我想我还不完全理解GAE数据存储是如何工作的 我有以下实体(我删除了问题不需要的代码) 到目前为止还不错。。我正在使用端点,如果我想添加新帖子或在帖子上发布新评论,我已经有几个功能可以正常工作了, 只有当我想获取某个特定帖子的所有评论列表时,我才会遇到问题,比如访问post.getComments() 我使用fetch=FetchType.LAZY,因为在某些情况下,我只想获取数据库中的所有帖子,而不包含注释,例如,以某种索引的形式显示它们 例如,当我尝试以下方法时:如何从google app engine中的GAE数据存储访问延迟加载的对象-JAVA JPA,java,google-app-engine,jpa,lazy-loading,Java,Google App Engine,Jpa,Lazy Loading,我已经为一个问题挣扎了很长一段时间,我想我还不完全理解GAE数据存储是如何工作的 我有以下实体(我删除了问题不需要的代码) 到目前为止还不错。。我正在使用端点,如果我想添加新帖子或在帖子上发布新评论,我已经有几个功能可以正常工作了, 只有当我想获取某个特定帖子的所有评论列表时,我才会遇到问题,比如访问post.getComments() 我使用fetch=FetchType.LAZY,因为在某些情况下,我只想获取数据库中的所有帖子,而不包含注释,例如,以某种索引的形式显示它们 例如,当我尝试以下
@ApiMethod(name = "getPostComments")
public List<Comment> getPostComments(@Named("postId") Long postId) {
EntityManager mgr = getEntityManager();
List<Comment> results = new ArrayList<Comment>();
try {
Post p = mgr.find(Post.class, postId);
if (p == null) {
throw new EntityNotFoundException("Post does not exist");
} else {
results = p.getComments();
}
} finally {
mgr.close();
}
return results;
}
@ApiMethod(name=“getPostComments”)
公共列表getPostComments(@Named(“postId”)Long postId){
EntityManager mgr=getEntityManager();
列表结果=新建ArrayList();
试一试{
Post p=经理查找(Post.class,posted);
if(p==null){
抛出新EntityNotFoundException(“Post不存在”);
}否则{
结果=p.getComments();
}
}最后{
经理关闭();
}
返回结果;
}
我在java.lang.IllegalArgumentException中收到错误的请求错误400
我尝试了各种不同的方法,但都没有成功,我找到的所有解决方案都是说我应该使用fetch=FetchType.EAGER,这是我不想要的,老实说,它让人觉得懒惰类型是无用的。
很明显我错过了什么!请帮忙!如果你能写一个获取列表的例子,那就太好了 最终,我的解决方案是创建一个新类型的对象,该对象没有对延迟加载的内部对象的任何引用,并将想要的信息复制到该对象,然后返回它 对于这个例子,我这样做: 新的结果类:
public class CommentResults{
private String message;
private Long userId;
//getters and setters...
}
我的新getComments方法如下所示:
@ApiMethod(name = "getPostComments")
public List<CommentResults> getPostComments(@Named("postId") Long postId) {
EntityManager mgr = getEntityManager();
List<CommentResults> results = new ArrayList<Comment>();
try {
Post p = mgr.find(Post.class, postId);
if (p == null) {
throw new EntityNotFoundException("Post does not exist");
} else {
for(Comment c:p.getComments()){ //copying the data
CommentResults cr = new CommentResults();
cr.setMessage(c.getMessage);
cr.setUserId(c.getUserId);
results.add(cr);
}
}
} finally {
mgr.close();
}
return results;
}
@ApiMethod(name=“getPostComments”)
公共列表getPostComments(@Named(“postId”)Long postId){
EntityManager mgr=getEntityManager();
列表结果=新建ArrayList();
试一试{
Post p=经理查找(Post.class,posted);
if(p==null){
抛出新EntityNotFoundException(“Post不存在”);
}否则{
for(Comment c:p.getComments()){//复制数据
CommentResults cr=新CommentResults();
cr.setMessage(c.getMessage);
cr.setUserId(c.getUserId);
结果:添加(cr);
}
}
}最后{
经理关闭();
}
返回结果;
}
我仍然不确定这是否是最好的解决方案,必须创建一个新对象并在每个请求上复制信息对于一个服务器请求来说似乎是一项艰巨的任务,但它目前仍然有效,如果您知道更优雅的解决方案,请与我们分享 到底是什么问题?嘿,我更新了任务,基本上我只是想知道做这件事的正确方法是什么。谢谢
public class CommentResults{
private String message;
private Long userId;
//getters and setters...
}
@ApiMethod(name = "getPostComments")
public List<CommentResults> getPostComments(@Named("postId") Long postId) {
EntityManager mgr = getEntityManager();
List<CommentResults> results = new ArrayList<Comment>();
try {
Post p = mgr.find(Post.class, postId);
if (p == null) {
throw new EntityNotFoundException("Post does not exist");
} else {
for(Comment c:p.getComments()){ //copying the data
CommentResults cr = new CommentResults();
cr.setMessage(c.getMessage);
cr.setUserId(c.getUserId);
results.add(cr);
}
}
} finally {
mgr.close();
}
return results;
}