0

ここでの最初の投稿、誰かが私がジャグリングしようとしてきた問題に光を当てることができることを願っています...

学校のプロジェクトの一環として、地図上にポイントを表示し、地図上にパスを表示するためのインターフェースを構築しようとしています。

私たちの最初のスプリントでは、Objectifyを使用してアイテムの保存/取得を行うことができました-それはうまくいきました!

今、私たちは来年の春に向けて機能を拡張しようとしています。MapPath型のオブジェクトを格納しようとして問題が発生しました(2つのデータ型であるMapPathとMapDataに注意してください。どちらもクラスDataを拡張します)。次のような簡単なコードスニペット:

    @Entity
    public class Data extends JavaScriptObject
    {
        @Id
        Long id;
        private String name;
        private String dataSet;

     ...getters and setters
    }

    @Subclass
    public class MapData extends Data implements Serializable{
    {
        private String name;
        private String address;
        private String dataSet;
        @Embedded
        private Coordinate location;

            ....constructors, getters/setters
    }

    @Subclass
    public class PathData extends Data implements Serializable{

        private String name;
        private String address;
        private String dataSet;
        @Embedded
        private Coordinate[] path;

            ...etc
    }

今、私はまだあなたを失っていないことを願っています。基本的にすべてのトランザクションを処理するDataServiceクラスがあります。私は次の単体テストを持っています:

    @Test
    public void storeOnePath(){
        PathData pd = new PathData();
        pd.setName("hi");
        DataService.storeSingleton(pd);

        Data d = DataService.getSingleton("hi");

        assertEquals(pd,d);
    }    

getSingletonの実装は次のとおりです。

    public static void storeSingleton(Data d){
        Objectify obj = ObjectifyService.begin();
        obj.put(d);
}

JUnitは文句を言います:

java.lang.ExceptionInInitializerError
    at com.teamrawket.tests.DataTest.storeOnePath(DataTest.java:59)
        ...<taken out>
Caused by: java.lang.IllegalStateException: Attempting to create multiple associations on class com.teamrawket.server.MapData for name
    at com.googlecode.objectify.impl.Transmog$Visitor.addRootSetter(Transmog.java:298)
    at com.googlecode.objectify.impl.Transmog$Visitor.visitField(Transmog.java:231)
    at com.googlecode.objectify.impl.Transmog$Visitor.visitClass(Transmog.java:134)
    at com.googlecode.objectify.impl.Transmog.<init>(Transmog.java:319)
    at com.googlecode.objectify.impl.ConcreteEntityMetadata.<init>(ConcreteEntityMetadata.java:75)
    at com.googlecode.objectify.impl.Registrar.registerPolymorphicHierarchy(Registrar.java:128)
    at com.googlecode.objectify.impl.Registrar.register(Registrar.java:62)
    at com.googlecode.objectify.ObjectifyFactory.register(ObjectifyFactory.java:209)
    at com.googlecode.objectify.ObjectifyService.register(ObjectifyService.java:38)
    at com.teamrawket.server.DataService.<clinit>(DataService.java:20)
    ... 27 more

「名前のために...クラスに複数の関連付けを作成しようとする」とは、正確には何を意味しますか?

長い投稿と発生する可能性のあるフォーマットの問題については申し訳ありません。

4

2 に答える 2

1

サブクラスでフィールド名を繰り返しました。スーパークラスとサブクラスの両方で「name」と「dataSet」を宣言しないでください。これらのフィールドを MapData と PathData から削除すれば問題ありません。

于 2012-03-13T01:50:23.020 に答える
0

com.teamrawket.server.MapDatafullPathMapData ファイルの名前を参照します。最後のは、MapData クラスnameのフィールドを指します。String nameこの例外全体は、その特定の への参照が既に含まれていることを伝えようとしますfullPathfullPath同じものが既に登録されている別のオブジェクトがあると思います。エラーが発生した場所と同じように、行 59 がどこにあるかを知ることは役に立ちます。

于 2012-03-13T01:38:51.273 に答える