0

第一次在这里发帖,希望有人能对我一直试图解决的问题有所了解......

作为学校项目的一部分,我们正在尝试构建一个界面来显示地图上的点和地图上的路径。

在我们的第一个 sprint 中,我设法使用 Objectify 存储/检索项目 - 非常棒!

现在我们正在尝试为下一个春天扩展功能。现在尝试存储 MapPath 类型的对象时遇到问题(注意 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.MapData指的是fullPath您的 MapData 文件的名称。最后name的 是指String nameMapData 类中的字段。这整个异常试图告诉您它已经包含该特定的引用fullPath。我会说还有另一个fullPath已经注册的对象。知道第 59 行的位置与错误发生的位置完全相同会很有帮助。

于 2012-03-13T01:38:51.273 回答