I have an object with embedded members that I'm making persistent without problems using RDBMS and MySQL.
When I change the datastore to S3 (json plugin) I get the following exception:
Dec 30, 2011 9:50:30 AM org.datanucleus.state.JDOStateManagerImpl isLoaded
WARNING: Exception thrown by StateManager.isLoaded
This constructor is only for objects using application identity.
org.datanucleus.exceptions.NucleusUserException: This constructor is only for objects using application identity.
at org.datanucleus.state.JDOStateManagerImpl.initialiseForHollowAppId(JDOStateManagerImpl.java:226)
at org.datanucleus.state.ObjectProviderFactory.newForHollowPopulatedAppId(ObjectProviderFactory.java:119)
at org.datanucleus.store.json.fieldmanager.FetchFieldManager.getObjectFromJSONObject(FetchFieldManager.java:322)
at org.datanucleus.store.json.fieldmanager.FetchFieldManager.fetchObjectField(FetchFieldManager.java:250)
at org.datanucleus.state.AbstractStateManager.replacingObjectField(AbstractStateManager.java:2228)
at myproject.MyObject.jdoReplaceField(Unknown Source)
at myproject.MyObject.jdoReplaceFields(Unknown Source)
at org.datanucleus.state.JDOStateManagerImpl.replaceFields(JDOStateManagerImpl.java:1949)
at org.datanucleus.state.JDOStateManagerImpl.replaceFields(JDOStateManagerImpl.java:1976)
at org.datanucleus.store.json.JsonPersistenceHandler.fetchObject(JsonPersistenceHandler.java:269)
at org.datanucleus.state.JDOStateManagerImpl.loadFieldsFromDatastore(JDOStateManagerImpl.java:1652)
at org.datanucleus.state.JDOStateManagerImpl.loadSpecifiedFields(JDOStateManagerImpl.java:1254)
at org.datanucleus.state.JDOStateManagerImpl.isLoaded(JDOStateManagerImpl.java:1742)
at myproject.MyObject.jdoGetmember_(Unknown Source)
at myproject.MyObject.getMember(Unknown Source)
member_ in myproject.MyObject is defined as:
@Persistent
@Embedded(members = {
...
})
private Member member_;
and
@PersistenceCapable(detachable="true")
@EmbeddedOnly
public class Member implements Serializable {
(no application identity, no key)
The jdoconfig.xml is roughly:
<jdoconfig
xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig">
<persistence-manager-factory name="trans-optional">
<property name="javax.jdo.PersistenceManagerFactoryClass"
value="org.datanucleus.api.jdo.JDOPersistenceManagerFactory"/>
<property name="datanucleus.ConnectionURL"
value="amazons3:http://s3.amazonaws.com/"/>
<property name="datanucleus.ConnectionUserName"
value="..."/>
<property name="datanucleus.ConnectionPassword"
value="..."/>
<property name="datanucleus.cloud.storage.bucket"
value="mybucket"/>
</persistence-manager-factory>
</jdoconfig>
I've been to the Supported Features table but I must admit I don't fully understand it.
Does it say that the json plugin does NOT supports embedded objects? Why do my embedded objects need to have application identity? If I define them with application identity I'm also asked to provide a key and I don't want that, I want them to be embedded.
Any help will be much appreciated!
As the Supported Features table says very clearly (to me), there is a CROSS against the JSON datastore column for the feature "Embedded PC", hence it is not supported for that datastore. Obviously if some user/company wanted such a feature they could either
Alternatively, don't use embedded objects with that datastore.