Spring Hibenate: обновление отношения ManyToMany через REST - PullRequest
0 голосов
/ 06 июня 2019

У меня есть весенний проект с REST, JPA & HATEOAS, у меня есть UserProfile сущность с ManyToMany ассоциацией с Tag сущностью следующим образом


    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(
            name = "user_profile_special_case_tag_assoc",
            joinColumns = { @JoinColumn(name = "user_profile_id")},
            inverseJoinColumns = { @JoinColumn(name = "tag_id")}
    )
    @RestResource(exported = false)
    private Set special_cases = new HashSet();

Если я перечисляю сущность userProfiles через REST, она становится массивом Tag, что и ожидается. * 1007 то есть *


    {
      "special_cases": []
    }

Я также могу вставить или полностью удалить связь с запросом PATCH, т.е. PATCH http://localhost/userProfile/1


    {
      "special_cases": [
        {
          "tagId": 1
        },
        {
          "tagId": 2
        },
        {
          "tagId": 3
        }
      ]
    }

или полностью удалить ассоциации, т.е. PATCH http://localhost/userProfile/1


    {
      "special_cases": []
    }

Но если я попытаюсь частично изменить ассоциацию, я получу исключение. * 1020 то есть *


    {
      "special_cases": [
        {
          "tagId": 2
        },
        {
          "tagId": 3
        }
      ]
    }

Но я получаю


    {
        "timestamp": "2019-06-06T14:29:08.960+0000",
        "status": 500,
        "error": "Internal Server Error",
        "message": "identifier of an instance of Tag was altered from 1 to 2; nested exception is org.hibernate.HibernateException: identifier of an instance of Tag was altered from 1 to 2",
        "path": "/userProfiles/1"
    }

Насколько я понимаю, Hibernate пытается повторно использовать вложенную сущность Tag для идентификатора 1 и пытается обновить первичный ключ до 2. Поэтому исключение. Как я могу предотвратить это?

Может ли кто-нибудь помочь с ресурсом для реализации частичного изменения связи с REST & HATEOAS весной?

Мне интересно, есть ли способ указать hibernate удалить все ассоциации и повторно вставить их при обновлении.

...