Вызов clear для свойства объекта JPA с использованием AccessType.PROPERTY завершается неудачно - PullRequest
0 голосов
/ 19 февраля 2019

Я работаю с картой в объекте.

В установщике я очищаю карту и затем помещаю все свои значения.Я проверяю класс, значения там.Я сохраняю сущность: значения не сохраняются, а метод save хранилища возвращает мне сущность без значений !!!Я пытаюсь без clear ... это работает!

После некоторых экспериментов я нахожу что-то: я пытаюсь с базовой сущностью и тем же отображением.Когда типом доступа является PROPERTY, он не работает, но когда я пытаюсь использовать тип доступа FIELD, он работает.

Таким образом, проблема заключается в поведении вокруг типа acces.И, к сожалению, я не могу изменить свою иерархию классов (по некоторым рабочим причинам)

Вот свойство и получатель:

@Entity
@Access(AccessType.PROPERTY)
public class MyEntity {

    private Map<MyEnum, Integer> myEnums = new EnumMap<>(MyEnum.class);

    // (...)

    @Override
    @ElementCollection
    @MapKeyColumn(name = "my_enum", columnDefinition = "enum('A', 'B', 'C')")
    @MapKeyEnumerated(EnumType.STRING)
    public Map<MyEnum, Integer> getMyEnums() {
        return myEnums;
    }

    void setMyEnums(Map<MyEnum, Integer> myEnums) {

        // this work
        // this.myEnums= new EnumMap<>(myEnums);

        // this work to (but I can't keep it because the map is not cleared)
        // for (MyEnum myEnum : myEnums.keySet()) this.myEnums.put(myEnum, myEnums.get(myEnum));

        // this doesn't work
        this.myEnums.clear();
        for (MyEnum myEnum : myEnums.keySet()) this.myEnums.put(myEnum, myEnums.get(myEnum));
    }

    // (...)

}

Я действительно думаю, что здесь есть проблема.

Есть ли способ работать с AccessType.PROPERTY и избежать такого поведения?Мне нужно использовать метод clear() и тип доступа PROPERTY.

Для информации, это проект spring-boot, и я воспроизвожу проблему с 1.5.3.RELEASE и 2.0.3.RELEASE.

Я создаю модульный тест для воспроизведения этой проблемы: https://github.com/Mohicane/jpa-accesstype

1 Ответ

0 голосов
/ 19 февраля 2019

В установщике я очищаю карту и затем помещаю все свои значения.

Это плохая идея.Не делай этого.Если вы хотите объединить коллекцию, эта статья объясняет, как это сделать.

Есть ли способ работать с AccessType.PROPERTY и избежать такого поведения?

Да, конечно, есть способ.Только не clear постоянная коллекция, поскольку фаза DELETE выполняется после фазы INSERT во время сброса контекста постоянства .

Мне нужно использовать метод clear ()и тип доступа НЕДВИЖИМОСТЬ.

Нет, вам не нужно использовать clear.Вам нужно сделать правильное слияние коллекций .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...