1

ノードのツリーを作成し、それをオブジェクト指向データベース (db4o) に格納します。データベースからノードを効率的にロードしたいので、Transparent Activation を使用し、Activatable インターフェイスを実装します。私のノードクラスは次のとおりです。

package directory_service_server;

import com.db4o.activation.ActivationPurpose;
import com.db4o.activation.Activator;
import com.db4o.ta.Activatable;
import java.util.ArrayList;


public class Node implements Activatable{

    private String name;
    private String attribute;
    private ArrayList<Node> children;
    private transient Activator _activator; 
    //Node father;

    public Node()
    {
        this.name="";
        this.attribute="";
        this.children= new ArrayList<Node>();
      //  this.father= new Node ();
    }
    public Node(String name, String attribute, ArrayList<Node> children)
    {
        this.name=name;
        this.attribute=attribute;
        this.children=children;

    }

    void setName(String name)
    {

        this.name=name;
    }

    void setAttribute(String attribute)
    {
        this.attribute=attribute;
    }

    void setChildren(ArrayList<Node> children)
    {
       this.children=children; 

    }


    String getName()
    {
        this.activate(ActivationPurpose.READ);
        return name;
    }

    String getAttribute()
    {
        this.activate(ActivationPurpose.READ);
        return this.attribute;
    }

    String getAttributeWithoutActivation()
    {
        return this.attribute;
    }

    ArrayList<Node> getChildren()
    {
        this.activate(ActivationPurpose.READ);
        return children;
    }


    @Override
    public void activate(ActivationPurpose purpose) {
        if(_activator!=null)
            _activator.activate(purpose);
    }

    @Override
    public void bind(Activator activator) {

        if(_activator==activator)
        {
            return;
        }


        if(activator!=null && _activator!=null )
        {
            throw new IllegalStateException();
        }

         _activator=activator;   
    }




}

データベースからルート (ノード) をロードし、グラフのトラバースを開始すると、トラバース メソッド (ノード値も出力されます) は次のようになります。

 void displayTree(Node node)
    {
        System.out.print(node.getName()+"-");
        for(int i=0; i<node.getChildren().size(); i++)
            displayTree(node.getChildren().get(i));
    }

私を混乱させているのは、「いくつかのトラバーサル」の場合、トラバーサルを行うときにNull Exceptionが発生するかどうかを判断できないことです。上記のメソッドの次の行で例外が発生します。

for(int i=0; i<node.getChildren().size(); i++)

私の解釈では、ノードの子は NULL であるため、size() メソッドにアクセスすると NULL が返されます。Activatable クラスの実装に何かが欠けているのではないかと思います。実装には次のソースを使用しましたが、他のソースは見つかりませんでした。http://docs.huihoo.com/db4o/db4o-7.0-java-tutorial.pdf

誰かが私に欠けているものを教えてくれますか? 以下はスタック トレースの一部です。

ava.lang.NullPointerException
    at directory_service_server.Tree.displayTree(Tree.java:88)
    at directory_service_server.Tree.displayTree(Tree.java:89)
    at directory_service_server.Tree.displayTree(Tree.java:89)
    at directory_service_server.Tree.displayTree(Tree.java:89)
    at directory_service_server.ClientHandler.registerService(ClientHandler.java:187)
    at directory_service_server.ClientHandler.run(ClientHandler.java:59)
    at java.lang.Thread.run(Thread.java:722)
com.db4o.events.EventException
    at com.db4o.internal.events.EventRegistryImpl.withExceptionHandlingInCallback(EventRegistryImpl.java:283)
    at com.db4o.internal.events.EventRegistryImpl.triggerObjectInfoEventInCallback(EventRegistryImpl.java:270)
    at com.db4o.internal.events.EventRegistryImpl.objectOnNew(EventRegistryImpl.java:89)
    at com.db4o.internal.ObjectReference.objectOnNew(ObjectReference.java:194)
    at com.db4o.internal.ObjectReference.continueSet(ObjectReference.java:180)
    at com.db4o.internal.ObjectContainerBase.stillToSet(ObjectContainerBase.java:1902)
    at com.db4o.internal.ObjectContainerBase.store2(ObjectContainerBase.java:1698)
    at com.db4o.internal.ObjectContainerBase.storeAfterReplication(ObjectContainerBase.java:1618)
    at com.db4o.internal.ObjectContainerBase$10.apply(ObjectContainerBase.java:1604)
    at com.db4o.internal.ObjectContainerBase$10.apply(ObjectContainerBase.java:1602)
    at com.db4o.internal.ObjectContainerBase.asTopLevelCall(ObjectContainerBase.java:427)
    at com.db4o.internal.ObjectContainerBase.asTopLevelStore(ObjectContainerBase.java:413)
    at com.db4o.internal.ObjectContainerBase.storeInternal(ObjectContainerBase.java:1602)
    at com.db4o.internal.marshall.MarshallingContext.writeObject(MarshallingContext.java:252)
    at com.db4o.internal.OpenTypeHandler.writeObject(OpenTypeHandler.java:266)
    at com.db4o.internal.OpenTypeHandler.write(OpenTypeHandler.java:251)
    at com.db4o.internal.marshall.MarshallingContext.writeObjectWithCurrentState(MarshallingContext.java:272)
    at com.db4o.internal.marshall.MarshallingContext.writeObject(MarshallingContext.java:260)
    at com.db4o.typehandlers.CollectionTypeHandler.writeElements(CollectionTypeHandler.java:56)
4

1 に答える 1

0

通常の Collection(s) の代わりにActivatable コレクションを使用しようとしましたか? すべての標準 Java コレクションには、アクティブ化可能なコレクションがあります。これらのコレクションには、ActivationPurpose.READ/WRITE が既に定義されています。

また、「透過的なアクティベーション」を使用していると思いますが、「注釈」は使用していないため、セッター/ゲッターごとに ActivationPurpose を定義する必要があります。私のプロジェクトでは、正確に versant db4o の透過的なアクティブ化とその正常な動作を行います。

また、transparentpersistence + *ta_enhanced_example* を参照して、適切な注釈プロセスを取得する必要があります。これはちょっとした魔法ですが、最終的には機能します。

于 2013-07-02T19:44:40.450 に答える