GAE/JDO에서 Long 유형의 ID 목록을 쿼리하려고합니다. 결과 집합에 detachCopyAll()을 호출하면 다음과 같은 예외가 발생합니다. java.lang.Long이 지속되지 않는 이유는 무엇입니까?
org.datanucleus.jdo.exceptions.ClassNotPersistenceCapableException: The class "The class "java.lang.Long" is not persistable. This means that it either hasnt been enhanced, or that the enhanced version of the file is not in the CLASSPATH (or is hidden by an unenhanced version), or the Meta-Data/annotations for the class are not found." is not persistable. This means that it either hasnt been enhanced, or that the enhanced version of the file is not in the CLASSPATH (or is hidden by an unenhanced version), or the Meta-Data for the class is not found.
at org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:241)
at org.datanucleus.jdo.JDOPersistenceManager.jdoDetachCopy(JDOPersistenceManager.java:1110)
at org.datanucleus.jdo.JDOPersistenceManager.detachCopyAll(JDOPersistenceManager.java:1183)
...
나는 사용자 개체의 목록을 쿼리하고 그들이 잘 분리 할 수 있습니다. Long과 같은 원시 래퍼 클래스는 지속성이 있어야합니다. 내가 도대체 뭘 잘못하고있는 겁니까? 아래 코드는 제가 작업하고있는 코드입니다.
@PersistenceCapable(identityType=IdentityType.APPLICATION, detachable="true")
public class User
{
@PrimaryKey
@Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)
private Long id;
private String email;
}
@SuppressWarnings("unchecked")
public static List<Long> getUserKeys(String email)
{
assert email != null;
List<Long> keyList = null;
PersistenceManager pm = null;
Query query = null;
try {
pm = PMF.get().getPersistenceManager();
query = pm.newQuery("select id from " + User.class.getName());
query.declareParameters("String emailParam");
query.setFilter("email == emailParam");
List<Long> resultList = (List<Long>) query.execute(email);
// next line causes the ClassNotPersistenceCapableException
keyList = (List<Long>) pm.detachCopyAll(resultList);
}
finally {
if (query != null) query.closeAll();
if (pm != null) pm.close();
}
return keyList;
}
실제로 Longs는 분리해야합니다. 그렇지 않으면 PersistenceManager가 닫힌 후에 쿼리의 데이터를 사용하려고하면 다음과 같은 예외가 발생합니다. 시도 해봐. 'org.datanucleus.exceptions.NucleusUserException : NullusUserException : Object Manager가 닫혔습니다. ' List을 분리 할 수 없기 때문에 수동으로 루프에서 요소를 복사해야합니다. 이것은 DataNucleus의 감독처럼 보입니다. –
KenSV
아니요 * Long을 분리하지 않습니다 *. detachCopyAll에 전달 된 객체는 JDO spec 및 DataNucleus docs에 따라 지속 가능한 유형이어야하며 Thilo가 응답해야합니다. – DataNucleus
'List'을 분리 할 필요가 없다면 왜 객체 관리자를 사용하려고 할 때 객체 관리자가 닫히는 예외가 있습니까? –
KenSV