问题
I'm using datanucleus with mongodb. I want to persist my own type (which extends java.util.Set) but not able to. It throws exception. What should I be doing?
Here is the code:
My custom object which is part of my object which I want to persist - CustomSet.java
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class CustomSet<E> implements Set<E> {
private final Set<E> hashSet = new HashSet<E>();
@Override
public int size() {
return hashSet.size();
}
@Override
public boolean isEmpty() {
return hashSet.isEmpty();
}
@Override
public boolean contains(Object o) {
return hashSet.contains(o);
}
@Override
public Iterator<E> iterator() {
return hashSet.iterator();
}
@Override
public Object[] toArray() {
return hashSet.toArray();
}
@Override
public <T> T[] toArray(T[] a) {
return hashSet.toArray(a);
}
@Override
public boolean add(E e) {
return hashSet.add(e);
}
@Override
public boolean remove(Object o) {
return hashSet.remove(o);
}
@Override
public boolean containsAll(Collection<?> c) {
return hashSet.containsAll(c);
}
@Override
public boolean addAll(Collection<? extends E> c) {
return hashSet.addAll(c);
}
@Override
public boolean retainAll(Collection<?> c) {
return hashSet.retainAll(c);
}
@Override
public boolean removeAll(Collection<?> c) {
return hashSet.removeAll(c);
}
@Override
public void clear() {
hashSet.clear();
}
}
My Object which I want to persist - MyDBObject.java
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
@PersistenceCapable(detachable = "true")
public class MyDBObject {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.UUIDHEX)
private String id;
@Persistent
private String name = null;
@Persistent
private CustomSet<String> set = null;
public MyDBObject(String name, CustomSet<String> set) {
this.name = name;
this.set = set;
}
}
A test code to show the problem:
public class Test {
private final static PersistenceManagerFactory pmFactory = JDOHelper
.getPersistenceManagerFactory(new File("appdb.properties"));
public static void main(String[] args) {
CustomSet<String> set = new CustomSet<>();
set.add("Test-1");
set.add("Test-2");
set.add("Test-3");
saveOrUpdate(pmFactory.getPersistenceManager(), new MyDBObject(
"TestObject", set));
}
public static <T> void saveOrUpdate(PersistenceManager pm, T object) {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
pm.makePersistent(object);
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
pm.close();
}
}
}
After executing the above code I am getting the following exception:
Exception in thread "main" java.lang.ClassCastException: org.datanucleus.store.types.wrappers.Collection cannot be cast to test.beans.CustomSet at test.beans.MyDBObject.dnReplaceField(MyDBObject.java) at org.datanucleus.state.StateManagerImpl.replaceField(StateManagerImpl.java:1910) at org.datanucleus.state.StateManagerImpl.replaceField(StateManagerImpl.java:3112) at org.datanucleus.state.StateManagerImpl.replaceField(StateManagerImpl.java:3015) at org.datanucleus.store.types.SCOUtils.createSCOWrapper(SCOUtils.java:233) at org.datanucleus.store.types.SCOUtils.newSCOInstance(SCOUtils.java:135) at org.datanucleus.state.StateManagerImpl.wrapSCOField(StateManagerImpl.java:3378) at org.datanucleus.store.mongodb.fieldmanager.StoreFieldManager.storeNonEmbeddedObjectField(StoreFieldManager.java:569) at org.datanucleus.store.mongodb.fieldmanager.StoreFieldManager.storeObjectField(StoreFieldManager.java:505) at org.datanucleus.state.AbstractStateManager.providedObjectField(AbstractStateManager.java:1457) at org.datanucleus.state.StateManagerImpl.providedObjectField(StateManagerImpl.java:117) at test.beans.MyDBObject.dnProvideField(MyDBObject.java) at test.beans.MyDBObject.dnProvideFields(MyDBObject.java) at org.datanucleus.state.StateManagerImpl.provideFields(StateManagerImpl.java:1198) at org.datanucleus.store.mongodb.MongoDBPersistenceHandler.getDBObjectForObjectProviderToInsert(MongoDBPersistenceHandler.java:388) at org.datanucleus.store.mongodb.MongoDBPersistenceHandler.insertObject(MongoDBPersistenceHandler.java:220) at org.datanucleus.state.StateManagerImpl.internalMakePersistent(StateManagerImpl.java:3489) at org.datanucleus.state.StateManagerImpl.makePersistent(StateManagerImpl.java:3465) at org.datanucleus.ExecutionContextImpl.persistObjectInternal(ExecutionContextImpl.java:2031) at org.datanucleus.ExecutionContextImpl.persistObjectWork(ExecutionContextImpl.java:1874) at org.datanucleus.ExecutionContextImpl.persistObject(ExecutionContextImpl.java:1722) at org.datanucleus.api.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:722) at org.datanucleus.api.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:747) at test.Test.saveOrUpdate(Test.java:30) at test.Test.main(Test.java:22)
来源:https://stackoverflow.com/questions/29107164/persisting-user-type-with-datanucleus