2012-02-22 12 views
0

私はという親クラスを持っています。これらのオブジェクトをHighレプリケーションデータストアに保存しています。永続的/非永続的なコレクションフィールドを持つオブジェクトを削除する方法nullですか?

各オブジェクトには、私がキーオブジェクトのリストを格納することにより、管理オブジェクトと所有されていない関係を持っています。

親とすべての子オブジェクトをJSON表現として返すREST Webサービスがあります。 Jacksonマーシャラーを使用するために、Childオブジェクトのコレクションを取得し、パラメータ化された型を定義していない未加工のCollectionを使用して、そのコレクションをParentに追加します。

コレクションフィールドは、私が残そうとしていたものではありませんでした。しかし、According to DataNucleus's Andy, Google's JDO @Persistent documentation is potentially incorrectなので、フィールドに@NotPersistentアノテーションを入れていませんでした。今私は、データストア内のユーザーデータがあり、Parentクラスを変更して誤って破棄しないように注意する必要があります。私はそれが可能かどうか、それが起こるかどうかは分からないので、私は慎重に進んでいます。

このヌルに格納されているデータはありません。コレクションカードリストの値です。しかし、私はフィールドを切り離すことができないということについて、しばしば間違いを起こします。

  • (Andyによると@Persistentにデフォルト設定されている)アノテーションは一切なく、オブジェクトを削除できません。
  • フィールドに@NotPersistentを置くと、データにアクセスすることはできず、何も動作しません。

ここでは、クラス "親" である:ここでは

public class Parent implements Serializable { 

    private static final long serialVersionUID = 1L;  

    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Key key; 

    @Persistent 
    private String keyString; 

    @Persistent 
    private String name; 

    // store keys that associate with Child objects 
    @Persistent 
    private List<Key> childRealKeys = new ArrayList<Key>(); 

    /** 
    * If @NotPersistent, no Parent is accessible. 
    * If @NotPersistent is commented, the data loads, but I cannot delete the parent. 
    * 
    * This field was not intended to be stored and is just used to serialize the Parent 
    * and Children to a single JSON object to be returned in a REST call. 
    */ 
    // @NotPersistent 
    private Collection childList = null; 

    // getter for the field I don't want to store but just use to return children in the REST service as JSON 
    public Collection getChildList() { return childList; } 

    // remaining getters and setters follow ... 

は、私は、オブジェクトを削除するために使用しているコードです:

public void deleteParent(String keyString) { 

    PersistenceManager pm = PMF.getInstance().getPersistenceManager(); 
    Parent parent = null; 

    Key parentKey = KeyFactory.stringToKey(keyString); 
    parent = pm.getObjectById(Parent.class, parentKey); 

    // I tried detaching to see if that helps. It still says the field is not detached! 
    Parent detachedParent = pm.detachCopy(parent); 
    pm.deletePersistent(detachedParent.getChildList()); 
    pm.deletePersistent(detachedParent); 

    pm.close(); 

} 

のStackTraceオブジェクトを削除しようとしたとき:

なお、データはありませんこのフィールドに格納されます。私はまた、フィールドを正常に切り離すこともできません。

javax.jdo.JDODetachedFieldAccessException: You have just attempted to access field "childList" yet this field was not detached when you detached the object. Either dont access this field, or detach it when detaching the object. 
at com.fullcreative.loop.Parent.jdoGetChildList(Parent.java) 
at com.fullcreative.loop.Parent.getChildList(Parent.java:112) 
at com.fullcreative.loop.LoopDaoJdo.deleteParent(LoopDaoJdo.java:690) 
at com.fullcreative.loop.LoopService.deleteParent(LoopService.java:551) 
at com.fullcreative.loop.LoopController.deleteParent(LoopController.java:1022) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:104) 
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) 
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426) 
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
at org.springframework.web.servlet.FrameworkServlet.doDelete(FrameworkServlet.java:582) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:643) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:369) 
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109) 
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381) 
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381) 
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381) 
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381) 
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381) 
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381) 
at com.fullcreative.loop.security.auth.GaeAuthenticationFilter.doFilter(GaeAuthenticationFilter.java:227) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381) 
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381) 
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:168) 
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:35) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:60) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:78) 
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:362) 
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
at org.mortbay.jetty.Server.handle(Server.java:326) 
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) 
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547) 
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212) 
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 

質問:

  • どのように私は、親オブジェクトを削除することができますか?

  • すべてのデータを失うことなく、データストアからnullコレクションフィールドを削除するにはどうすればよいですか?親と子のキーをデータストアに格納するためのものと、親とすべての関連する子をJSON表現として返すための別の2つのオブジェクトを使用するのが最善の方法です。

  • 遡及的にCollection cardListフィールドをNotPersistentにする方法はありますか?フロントエンドでデータをシリアル化するために使用できますか?あなたのコレクションは、一過方法で@Persistent childRealKeysを変換するためにのみ使用されている場合

+0

ないこのことができますが、私はたchildListコレクションに@NotPersistentで実行した場合、私が得れば確か:「クラス 『を』 CLASSPATHで見つかりませんでした。」 JDOExceptionとして – jmort253

答えて

1

は、それは@NotPersistentたchildListでなければなりません。その文脈では

// pm.deletePersistent(detachedParent.getChildList()); becomes unnecessary, and 
pm.deletePersistent(parent); //should work 

あなたが、その場合には別の例外を取得していますか? @ jmort253によって

UPDATE:確かにチェック

AppEngineのJARファイルが重複していないが、プロジェクトに含まれています。私は以前にアップグレードし、古いJARのいくつかはCLASSPATHから削除されませんでした。クラスローダーは古いバージョンを読み込んで新しいバージョンを無視することがありますが、これは私の場合に起こっています。依存関係を解決することで問題が解決されることが判明しました。

さらに、問題なしで@NotPersistentを使用できます。トランザクションを使用してオブジェクトをデタッチし、PMF DataNucleus DetachOnClose propertyAndy describes in this Google Groupとしてデタッチできます。

削除親

public boolean deleteLoop(String parentId) { 
    PersistenceManager pm = PMF.getInstance().getPersistenceManager(); 
    Transaction tx = pm.currentTransaction(); 
    try { 
     tx.begin(); 
     pm.setDetachAllOnCommit(true); 
     Parent parent = null; 

     Key parentKey = KeyFactory.stringToKey(parentId); 
     loop = pm.getObjectById(Parent.class, parentKey); 

     Parent detachedParent = pm.detachCopy(parent); 

        // this was indeed not necessary 
     //pm.deletePersistent(detachedParent.getChildList()); 

        // no detachment issues, object deletes just fine. 
     pm.deletePersistent(detachedParent); 

     tx.commit(); 
     //pm.close(); 

    } catch(Exception e) { 
     log.error("Exception trying to delete Parent :: ",e); 
     e.printStackTrace(); 


    } finally { 

     if(tx.isActive()) { 
      tx.rollback(); 
     } 

     pm.close(); 
    } 
} 

親クラス:

は現在、クラスパスの警告を取得せずに@NotPersistentを追加することができます。 JARの依存性の問題に加えて、私はCollectionの定義にパラメータ化された型を追加しなければなりませんでした。省略された場合、次の警告が表示されます。

  • クラス ""がCLASSPATHに見つかりませんでした。あなたの仕様とCLASSPATHを確認してください。

    @PersistenceCapable(detachable = "true") 
    public class Parent implements Serializable { 
        ... 
        @NotPersistent 
        private Collection<Child> childList; 
        ...  
    } 
    
+0

はい、トラブルシューティングの手順としてコメントアウトした行を追加しました。それは違いを生むようには見えなかった。また、私は自分の質問で@NotPersistentアノテーションを追加すると、 'Class'がCLASSPATHに見つかりませんでした。 JDOExceptionがスローされる – jmort253

+0

追加した内容が私の問題の原因と解決策を最終的に見つけるのに役立ちましたので、私はあなたの答えを更新して受け入れました。ありがとう! – jmort253

関連する問題