java.lang.IllegalStateException: попытка создать несколько ассоциаций для переменных класса - PullRequest
0 голосов
/ 13 марта 2012

первый пост здесь, в надежде, что кто-то может пролить свет на проблему, которую я пытался решить ...

В рамках школьного проекта мы пытаемся создать интерфейс для отображения точек на карте и путей на карте.

Для нашего первого спринта мне удалось отработать хранение / получение предметов с помощью 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);
}

Юнит жалуется:

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

Что именно означает "попытка создать несколько ассоциаций в классе ... для имени"?

Извините за длинный пост и любые проблемы с форматированием, которые могут возникнуть.

Ответы [ 2 ]

1 голос
/ 13 марта 2012

Вы повторили имена полей в своих подклассах.Вы не должны объявлять 'name' и 'dataSet' как в суперклассах, так и в подклассах;удалите эти поля из MapData и PathData, и все будет в порядке.

0 голосов
/ 13 марта 2012

com.teamrawket.server.MapData относится к fullPath имени вашего файла MapData. name в конце относится к полю String name в вашем классе MapData. Это целое исключение пытается сказать вам, что оно уже содержит ссылку на этот конкретный fullPath. Я бы сказал, что есть еще один объект с таким же fullPath, который уже зарегистрирован. Было бы полезно узнать, где строка 59 точно так же, как и там, где произошла ошибка.

...