2012-11-11 41 views
1

如何在GAA Datastore中將JPA實體(非JDO)中的id字段聲明爲「Key as encoded String」?您可以找到JDO的示例,但不能用於JPA。使用JPA for GAE自動生成的id(鍵爲編碼字符串)

只要在子 - 父關係中使用實體,就不能聲明id字段。

所以,我的實體是這樣的:

@Entity 
public class EntityClass { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true") 
    private String id; 

因此,它同時使用JPA和JDO註解。

所以,試圖堅持實體對象我得到一個例外:

不能有一個空的主鍵字段如果字段爲未編碼和String類型。請提供一個值,或者,如果您希望數據存儲以您的名義生成一個id,請將該字段的類型更改爲Long。 org.datanucleus.store.appengine.FatalNucleusUserException:name.xxx.tips.db.User的主鍵無效。如果字段未經編碼且字符串類型不能爲空主鍵字段。請提供一個值,或者,如果您希望數據存儲以您的名義生成一個id,請將該字段的類型更改爲Long。

Full Stacktrace: 如果字段未經編碼且字符串類型不能爲空主鍵字段。請提供一個值,或者,如果您希望數據存儲以您的名義生成一個id,請將該字段的類型更改爲Long。 org.datanucleus.store.appengine.FatalNucleusUserException:name.xxx.tips.db.User的主鍵無效。如果字段未經編碼且字符串類型不能爲空主鍵字段。請提供一個值,或者,如果您希望數據存儲以您的名義生成一個id,請將該字段的類型更改爲Long。 在org.datanucleus.store.appengine.DatastoreFieldManager.storeStringPKField(DatastoreFieldManager.java:540) 在org.datanucleus.store.appengine.DatastoreFieldManager.storeStringField(DatastoreFieldManager.java:460) 在org.datanucleus.state.AbstractStateManager。 provided.tringField(AbstractStateManager.java:1023) at name.xxx.tips.db.User.jdoProvideField(User.java) at name.xxx.tips.db.User.jdoProvideFields(User.java) at org.datanucleus。 state.JDOStateManagerImpl.provideFields(JDOStateManagerImpl.java:2715) 在org.datanucleus.store.appengine.DatastorePersistenceHandler.insertPreProcess(DatastorePersistenceHandler.java:357) 在org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObjects(DatastorePersistenceHandler.java: 2 67) 在org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObject(DatastorePersistenceHandler.java:256) 在org.datanucleus.state.JDOStateManagerImpl.internalMakePersistent(JDOStateManagerImpl.java:3185) 在org.datanucleus.state.JDOStateManagerImpl。齊平(JDOStateManagerImpl.java:4513) 在org.datanucleus.state.JDOStateManagerImpl.getExternalObjectId(JDOStateManagerImpl.java:1334) 在org.datanucleus.state.JDOStateManagerImpl.getObjectId(JDOStateManagerImpl.java:1234) 在name.xxx。 tips.db.User.jdoGetObjectId(User.java) 在org.datanucleus.jpa.JPAAdapter.getIdForObject(JPAAdapter.java:266) 在org.datanucleus.ObjectManagerImpl.exists(ObjectManagerImpl.java:1953) 在有機datanucleus.jpa.Ent ityManagerImpl.refresh(EntityManagerImpl.java:469)

+0

實體使用[maven插件](http://www.datanucleus.org/products/datanucleus/enhancer.html#maven)進行了增強,並且指定了 JPA配置參數。根據日誌增強成功完成。 JPA和JDO註釋(和增強字段)都在.class文件 – 4ntoine

回答

2

爲什麼在使用JPA時使用JDO註釋? 使用與JPA擴展的註解是

org.datanucleus.api.jpa.annotations.Extension 

如圖here

+0

中更改爲使用String而不是Key(也使用org.datanucleus.api.jpa.annotations.Extension)。然後得到另一個錯誤:不能有一個java.lang.String主鍵並且是一個子對象(擁有字段是name.xxx.tips.db.User.tips)。 \t在org.datanucleus.jpa.NucleusJPAHelper.getJPAExceptionForNucleusException(NucleusJPAHelper.java:264) \t在org.datanucleus.jpa.JPAQuery.getSingleResult(JPAQuery.java:224) – 4ntoine

+0

似乎不能用「Key作爲編碼的String 「在使用JPA – 4ntoine

+0

的GAE上,您可以使用JPA使用JDO的所有功能。這是因爲,一旦元數據被全部讀取完全相同的代碼 – DataNucleus

0
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 

import org.datanucleus.api.jpa.annotations.Extension; 

@Entity 
public class ChildEntity { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true") 
    private String Id; 

這對我的作品。