gpt4 book ai didi

java - 关闭持久性管理器后如何使查询结果可用

转载 作者:搜寻专家 更新时间:2023-10-31 19:31:20 25 4
gpt4 key购买 nike

我正在学习 GAE,但遇到了一些困难。如果我使用以下内容,并使用 finally 来确保持久性管理器已关闭,那么在尝试实际读取 Note 对象时会出现异常:

public class Notes {
public List<Note> getAll() {
PersistenceManager pm = PMF.instance().getPersistenceManager();

try {
Query query = pm.newQuery("select from com.uptecs.google1.model.Note order by subject");
return (List<Note>) query.execute();
} finally {
pm.close();
}
}
}

我得到的异常是这样的:

Object Manager has been closed
org.datanucleus.exceptions.NucleusUserException: Object Manager has been closed
at org.datanucleus.ObjectManagerImpl.assertIsOpen(ObjectManagerImpl.java:3876)
at org.datanucleus.ObjectManagerImpl.getFetchPlan(ObjectManagerImpl.java:376)
at org.datanucleus.store.query.Query.getFetchPlan(Query.java:497)

最佳答案

尝试使用 detachable="true" 从图形中分离对象:

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable="true")
public class Note {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long key;
...
}

注意:我完全理解这样做的必要性,有时您需要在 Controller 中检索对象和列表,关闭 Controller 中的 PM,然后将模型传递给 View 。在我知道更好的解决方案之前,这就是我在 JDO/GAE 上所做的,到目前为止没有任何问题。

列表:

在我看来,如果您想在 PM 关闭后能够使用它们,则必须分离列表中的所有项目。我会用它来获取特定的项目列表。完整的 getAll() 可能非常大。

public List<Note> getList(){
List<Note> detachedList=null, list=null;
try {
String query = "select from " + Note.class.getName();
pm = PMF.get().getPersistenceManager();
list = (List<Note>)pm.newQuery(query).execute();
detachedList = new ArrayList<Note>();
for(Note obj : list){
detachedList.add(pm.detachCopy(obj));
}

} finally {
pm.close();
}
return detachedList;

}

按键:

public Note findByKey(Long key) {
Note detachedCopy=null, object=null;
try{
pm= PMF.get().getPersistenceManager();
object = pm.getObjectById(Note.class,key);
detachedCopy = pm.detachCopy(object);
}catch (JDOObjectNotFoundException e) {
return null; // or whatever
}
finally {
pm.close(); // close here
}
return detachedCopy;

}

关闭后,您有一个分离的副本,您可以使用它进行工作。

引用:http://www.datanucleus.org/products/accessplatform_1_1/jdo/attach_detach.html

关于java - 关闭持久性管理器后如何使查询结果可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3242217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com