1

目前我的父類看起來是這樣,GAE/J數據存儲Presistent JDO刪除問題

public class UserVotesJDO { 

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

    @Persistent 
    private String mediaId; 

    @Persistent(dependent="true") 
    private LikesJDO likes; 

    @Persistent(dependent="true") 
    private HatesJDO hates; 

//使用getter和setter方法和其他變量 }

和我的孩子類hatesJDO看起來像

@PersistenceCapable(detachable = "true") 
public class HatesJDO { 

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

@Persistent 
private int count; 

private List<UserJDO> hatesUsersList; 
} 

其中UserJDO是另一個子類,它看起來像下面,

@PersistenceCapable(detachable="true") 
public class UserJDO { 

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

@Persistent 
private String userId; 

@Persistent 
private String userName; 

@Persistent 
private String fullName; 

@Persistent 
private String userEmail; 
} 

我的邏輯是,當我刪除UserVote我不再需要那些依賴孩子討厭和喜歡,而其UserJDO 所以當我嘗試刪除UserVotesJDO對象,我越來越控制檯的警告如下

Delete of [email protected] needs delete of related object at com.shoewars.jdo.ShoeWarsUserVotesJDO.hates but cannot delete it direct since FK is here 

我dint得到這一點外鍵是目前提及或使用.....

任何人都可以幫助我解決這個問題!

因爲這是我的第一篇,我不知道如何正確地張貼,不管怎麼說,我將解釋什麼,我試圖做

我有一個JDO存儲的圖片ID,並在這些人的信息誰喜歡這幅圖片也贊成這個圖片

爲此目的,我創建了兩個JDO likesJDO和HatesJDO,分別存儲列表。

所以,當我節省約在JDO投票信息,下面的事情發生

  1. 獲取用戶信息,並在任恨UsersList相應地存儲或喜歡

  2. 這些一起添加到UserVote JDO與圖像ID

  3. 終於堅持它

現在,我的問題是,當我刪除UserVote JDO,我想在hatesJDO和likesJDO這些記錄被刪除的,爲什麼我已添加

@Persistent(dependent="true") 
private LikesJDO likes; 

@Persistent(dependent="true") 
private HatesJDO hates; 

這些線路

,但現在,我得到異常而這樣

堆棧跟蹤將是這樣的:

com.uservote.service.UserVotesOperations updateUserVoteForMedia: Cannot read fields from a deleted object 
javax.jdo.JDOUserException: Cannot read fields from a deleted object 
FailedObject:com.google.appengine.api.datastore.Key:UserVotesJDO(80003)/LikesJDO(1)/UserJDO(2001) 
    at org.datanucleus.api.jdo.state.PersistentDeleted.transitionReadField(PersistentDeleted.java:116) 
    at org.datanucleus.state.AbstractStateManager.transitionReadField(AbstractStateManager.java:838) 
    at org.datanucleus.state.JDOStateManager.isLoaded(JDOStateManager.java:1699) 
    at com.uservotes.jdo.UserJDO.jdoGetuserId(UserJDO.java) 
    at com.uservotes.jdo.UserJDO.getUserDTO(UserJDO.java:157) 
    at com.uservotes.service.InstagramApiService.convertToUserDtoList(InstagramApiService.java:555) 
    at com.uservotes.jdo.LikesJDO.getLikesDTO(LikesJDO.java:95) 
    at com.uservotes.jdo.uservotesUserVotesJDO.getuservotesUserVotesDTO(uservotesUserVotesJDO.java:109) 
    at com.uservotes.service.UserVotesOperations.updateUserVoteForMedia(UserVotesOperations.java:242) 
    at com.uservotes.service.UserVotesOperations.updateUserVoteForMediaList(UserVotesOperations.java:162) 
    at com.uservotes.controller.UserVotesController.hanldeUpdateUserVotesRequest(UserVotesController.java:111) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:616) 
    at com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_$1.run(Method_.java:165) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_.privilegedInvoke(Method_.java:163) 
    at com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_.invoke_(Method_.java:124) 
    at com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_.invoke(Method_.java:43) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    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 com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:102) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35) 
    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 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.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:266) 
    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 com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:146) 
    at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:447) 
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:454) 
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:461) 
    at com.google.tracing.TraceContext.runInContext(TraceContext.java:703) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:338) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:330) 
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:458) 
    at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251) 
    at java.lang.Thread.run(Thread.java:679) 
+0

用任何異常記錄堆棧跟蹤將是必不可少的,正在使用的軟件版本,首先生成對象的持久性代碼以及刪除對象的持久性代碼。這將比發佈重複的問題更好http://stackoverflow.com/questions/14042628/how-to-delete-dependent-child-class-when-deleting-parent-jdo-in-google-app-engin – DataNucleus

+0

既然我很長時間(大概1周)得到任何迴應,我想編輯標題更加相關,但忘記刪除舊的。謝謝 –

+0

對這傢伙的任何幫助! –

回答

0

好像它的東西相關的延遲加載。嘗試在刪除之前訪問喜歡&仇恨(由getLikes()& getHates())。