2011-12-04 3 views
0

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; 
} 

답변

1
List<Long> resultList = (List<Long>) query.execute(email);   

    // next line causes the ClassNotPersistenceCapableException 
    keyList = (List<Long>) pm.detachCopyAll(resultList); 

난 당신이 여기에서 무엇을하고 있는지 이해하지 않습니다. List<Long>은 분리 할 필요가 없습니다. 사용자 엔티티 클래스의 인스턴스를 분리하고 싶지만 Long은 Long이며, resultList으로해야 할 일은 무엇이든 할 수 있습니다.

오류 메시지는 혼동 스럽지만 Long이 엔티티 클래스가 아니기 때문에 발생합니다.

+0

실제로 Longs는 분리해야합니다. 그렇지 않으면 PersistenceManager가 닫힌 후에 쿼리의 데이터를 사용하려고하면 다음과 같은 예외가 발생합니다. 시도 해봐. 'org.datanucleus.exceptions.NucleusUserException : NullusUserException : Object Manager가 닫혔습니다. ' List 을 분리 할 수 ​​없기 때문에 수동으로 루프에서 요소를 복사해야합니다. 이것은 DataNucleus의 감독처럼 보입니다. – KenSV

+0

아니요 * Long을 분리하지 않습니다 *. detachCopyAll에 전달 된 객체는 JDO spec 및 DataNucleus docs에 따라 지속 가능한 유형이어야하며 Thilo가 응답해야합니다. – DataNucleus

+0

'List '을 분리 할 필요가 없다면 왜 객체 관리자를 사용하려고 할 때 객체 관리자가 닫히는 예외가 있습니까? – KenSV