Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用DataNucleus持久化用户类型_Java_Mongodb_Datanucleus - Fatal编程技术网

Java 使用DataNucleus持久化用户类型

Java 使用DataNucleus持久化用户类型,java,mongodb,datanucleus,Java,Mongodb,Datanucleus,我在mongodb中使用datanucleus。我想持久化我自己的类型(它扩展了java.util.Set),但不能持久化。它抛出异常。我该怎么办? 代码如下: 我的自定义对象是我要持久化的对象的一部分-CustomSet.java import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class CustomSet<

我在mongodb中使用datanucleus。我想持久化我自己的类型(它扩展了java.util.Set),但不能持久化。它抛出异常。我该怎么办? 代码如下: 我的自定义对象是我要持久化的对象的一部分-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();
    }

}
import java.util.Collection;
导入java.util.HashSet;
导入java.util.Iterator;
导入java.util.Set;
公共类CustomSet实现了{
私有最终集hashSet=新hashSet();
@凌驾
公共整数大小(){
返回hashSet.size();
}
@凌驾
公共布尔值为空(){
返回hashSet.isEmpty();
}
@凌驾
公共布尔包含(对象o){
返回hashSet.contains(o);
}
@凌驾
公共迭代器迭代器(){
返回hashSet.iterator();
}
@凌驾
公共对象[]toArray(){
返回hashSet.toArray();
}
@凌驾
公共T[]toArray(T[]a){
返回hashSet.toArray(a);
}
@凌驾
公共布尔加法(E){
返回hashSet.add(e);
}
@凌驾
公共布尔删除(对象o){
返回hashSet.remove(o);
}
@凌驾
公共布尔容器(集合c){
返回hashSet.containsAll(c);
}
@凌驾
公共布尔addAll(集合c){
返回hashSet.retainal(c);
}
@凌驾
公共布尔removeAll(集合c){
返回hashSet.removeAll(c);
}
@凌驾
公共空间清除(){
clear();
}
}

我想要持久化的对象-MyDBObject.java

import javax.jdo.annotations.IdGeneratorStrategy;
导入javax.jdo.annotations.PersistenceCapable;
导入javax.jdo.annotations.Persistent;
导入javax.jdo.annotations.PrimaryKey;
@PersistenceCapable(detaccable=“true”)
公共类MyDBObject{
@主键
@持久性(valueStrategy=IdGeneratorStrategy.UUIDHEX)
私有字符串id;
@持久的
私有字符串名称=null;
@持久的
私有CustomSet=null;
公共MyDBObject(字符串名称,自定义集){
this.name=名称;
this.set=set;
}
}

显示问题的测试代码:

公共类测试{
私有最终静态持久化管理器工厂pmFactory=JDOHelper
.getPersistenceManagerFactory(新文件(“appdb.properties”);
公共静态void main(字符串[]args){
CustomSet=新的CustomSet();
设置。添加(“测试-1”);
设置。添加(“测试-2”);
设置。添加(“测试-3”);
saveOrUpdate(pmFactory.getPersistenceManager(),新的MyDBObject(
“TestObject”,set);
}
公共静态无效保存或更新(PersistenceManager pm,T对象){
事务tx=pm.currentTransaction();
试一试{
tx.begin();
makePersistent(对象);
tx.commit();
}最后{
if(tx.isActive()){
tx.回滚();
}
pm.close();
}
}
}

执行上述代码后,我得到以下异常:

线程“main”java.lang.ClassCastException中的异常:org.datanucleus.store.types.wrappers.Collection无法转换为test.beans.CustomSet 位于test.beans.MyDBObject.dnReplaceField(MyDBObject.java) 位于org.datanucleus.state.StateManagerImpl.replaceField(StateManagerImpl.java:1910) 位于org.datanucleus.state.StateManagerImpl.replaceField(StateManagerImpl.java:3112) 位于org.datanucleus.state.StateManagerImpl.replaceField(StateManagerImpl.java:3015) 位于org.datanucleus.store.types.SCOUtils.createSCOWrapper(SCOUtils.java:233) 位于org.datanucleus.store.types.SCOUtils.newSCOInstance(SCOUtils.java:135) 位于org.datanucleus.state.StateManagerImpl.wrapSCOField(StateManagerImpl.java:3378) 位于org.datanucleus.store.mongodb.fieldmanager.StoreFieldManager.storeNonEmbeddedObjectField(StoreFieldManager.java:569) 位于org.datanucleus.store.mongodb.fieldmanager.StoreFieldManager.storeObjectField(StoreFieldManager.java:505) 位于org.datanucleus.state.AbstractStateManager.providedObjectField(AbstractStateManager.java:1457) 位于org.datanucleus.state.StateManagerImpl.providedObjectField(StateManagerImpl.java:117) 位于test.beans.MyDBObject.dnProvideField(MyDBObject.java) 在test.beans.MyDBObject.dnProvideFields(MyDBObject.java)中 位于org.datanucleus.state.StateManagerImpl.provideFields(StateManagerImpl.java:1198) 位于org.datanucleus.store.mongodb.MongoDBPersistenceHandler.getDBObjectForObjectProviderToInsert(MongoDBPersistenceHandler.java:388) 位于org.datanucleus.store.mongodb.MongoDBPersistenceHandler.insertObject(MongoDBPersistenceHandler.java:220) 位于org.datanucleus.state.StateManagerImpl.internalMakePersistent(StateManagerImpl.java:3489) 位于org.datanucleus.state.StateManagerImpl.makePersistent(StateManagerImpl.java:3465) 位于org.datanucleus.ExecutionContextImpl.persistObjectInternal(ExecutionContextImpl.java:2031) 位于org.datanucleus.ExecutionContextImpl.persistObjectWork(ExecutionContextImpl.java:1874) 位于org.datanucleus.ExecutionContextImpl.persistObject(ExecutionContextImpl.java:1722) 位于org.datanucleus.api.jdo.jdoOperationResistenceManager.jdoMakePersistent(jdoOperationResistenceManager.java:722) 位于org.datanucleus.api.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:747) 在test.test.saveOrUpdate(test.java:30) 位于test.test.main(test.java:22)


首先,我不认为拥有自己的“HashSet”有什么意义。其次,如果您真的需要它,那么这个“集合”的包装器(代理)类在哪里?任何容器类(集合、映射)都必须有一个包装器,以便能够检测到对它的更改。查看DataNucleus核心代码库,您将在@NeilStockton上找到一些,编写包装器看起来是一项相当艰巨的任务。例如
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;
    }
}
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();
        }
    }
}