JPA @ Many-To-Many с дополнительным столбцом и удалением @OrderColumn не обновляет значение @OrderColumn

У меня есть сущности

Атрибут

@Entity
@Table(name = "Attributes")
public class Attribute implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Version
    private Long version = 0L;

    private String name = "";

    @Getter @Setter
    @OneToMany(mappedBy = "attribute", orphanRemoval = true)
    private Set<AttributeGroup> groups = new HashSet<>(0);

    // getters - setters
    // hashcode - equals, based on id
}

Группа

@Entity
@Table(name = "Groups")
public class Group implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Version
    private Long version = 0L;

    private String name = "";

    @OneToMany(mappedBy = "group", orphanRemoval = true, cascade = {PERSIST, MERGE})
    @OrderColumn(name = "ordinal", nullable = false, columnDefinition = "INT DEFAULT 0")
    private List<AttributeGroup> attributes = new ArrayList<>(0);

    // getters - setters
    // hashcode - equals, based on id
}

AttributeGroup / AttributeGroupId

@Entity
@Table(name = "AttributesGroups")
public class AttributeGroup implements Serializable {

    @EmbeddedId
    private AttributeGroupId id;

    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("groupId")
    @JoinColumn(name = "groupId", foreignKey = @ForeignKey(name = "FK_ATTRIBUTES_ATTRIBUTES_GROUPS"))
    private Group group;

    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("attributeId")
    @JoinColumn(name = "attributeId", foreignKey = @ForeignKey(name = "FK_ATTRIBUTES_GROUPS_ATTRIBUTES"))
    private Attribute attribute;

    public AttributeGroup(final Group group, final Attribute attribute) {
        this.id = new AttributeGroupId(group.getId(), attribute.getId());
        this.group = group;
        this.attribute = attribute;
    }

    // getters - setters
    // hashcode - equals, based on id
}

@Embeddable
class AttributeGroupId implements Serializable {

    private Long groupId;

    private Long attributeId;

    public AttributeGroupId() { }

    private AttributeGroupId(final Long groupId, final Long attributeId) {
        this.groupId = groupId;
        this.attributeId = attributeId;
    }

    // getters - setters
    // hashcode - equals, based on groupId and attributeId
}

Добавление некоторых атрибутов в группу, которая у меня есть

+---------------------------------+
| groupId | attributeId | ordinal |
+---------------------------------+
|    4    |      1      |    0    |
|---------------------------------|
|    4    |      2      |    1    |
|---------------------------------|
|    4    |      3      |    2    |
+---------------------------------+

Когда я удаляю атрибут (2) из ​​списка attributes группы (4) и сохраняю группу, все работает нормально, и у меня

+---------------------------------+
| groupId | attributeId | ordinal |
+---------------------------------+
|    4    |      1      |    0    |
|---------------------------------|
|    4    |      3      |    1    |
+---------------------------------+

Но когда я удаляю / удаляю атрибут (2) как есть, он удаляет его из связанной группы (4), но порядковый номер столбца не обновляется, поэтому у меня есть

+---------------------------------+
| groupId | attributeId | ordinal |
+---------------------------------+
|    4    |      1      |    0    |
|---------------------------------|
|    4    |      3      |    2    |
+---------------------------------+

Что-то не так с моей картой?

Есть ли способ исправить это, не используя EntityListeners?

Я использую Hibernate 5.3.1.Final в качестве поставщика JPA

Такое поведение имеет смысл. Удаление атрибута напрямую не приведет к обновлению. Лично я разрешил бы удаление только через группу. Здесь может помочь слушатель сущностей. По какой причине не использовать?

Alan Hay 28.11.2018 18:30

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

pbaris 28.11.2018 19:12

Как я уже отмечал, прямое удаление не повлияет. Так что либо не делайте этого, либо используйте Listener.

Alan Hay 28.11.2018 19:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
218
0

Другие вопросы по теме