Persisting user type with DataNucleus

丶灬走出姿态 提交于 2019-12-11 20:16:55

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!