Почему Hibernate помечает объект как грязный, если изменений нет?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Почему Hibernate помечает объект как грязный, если изменений нет?

Сообщение Anonymous »

Я использую Hibernate и JPA.
У меня есть объект, который выглядит следующим образом:

Код: Выделить всё

@Data
@Entity
@Table(name = "MY_ENTITY")
public class MyEntity {

@Id
@Column(name = "ID")
public Long id;

@Version
@Column(name = "VERSION")
public Long version = 1L;

@Embedded
@AttributeOverride(name = "timestamp", column = @Column(name = "UPDATED_TIME"))
public CustomTimestamp updatedTime;

@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "ENTITY_CONNECTION", joinColumns = @JoinColumn(name = "ENTITY_ID"))
@OrderColumn(name = "CONNECTION_ORDER")
@Fetch(FetchMode.SUBSELECT)
@JsonDeserialize(using = ConnectionDeserializer.class)
public List connections = new ArrayList();

@PreUpdate
public void preUpdate() {
this.updatedTime = new CustomTimestamp();
}

}

Код: Выделить всё

@Data
@Embeddable
public class Connection {

@Column(name = "CONNECTED_ENTITY_ID")
public String connectedEntityId;

@Column(name = "CONNECTED_ENTITY_TYPE")
public String connectedEntityType;

@Column(name = "NOTE")
public String note;

}
Ввод для объекта включает все поля с флагом удаления. Упомянутый десериализатор берет существующий список и выполняет сравнение с отправленным обновлением. Обновляет существующие объекты в списке, добавляет новые объекты и удаляет объекты, отмеченные флагом «удалить».
В API я предоставляю путь для «исправления» объекта, то есть пользователь передает поля, которые он хочет обновить. И я выполняю следующую логику:

Код: Выделить всё

MyEntity originalEntity = repository.findById(id);
ObjectReader entityForUpdate = objectMapper.readerForUpdating(originalEntity);
MyEntity updatedEntity = objectMapper.update(entityForUpdate, updateInput);
repository.saveAndFlush(updatedEntity);
И пример ввода «исправления» будет выглядеть примерно так:

Код: Выделить всё

patch /entity/{id}
body:
{
"connections": [
{
"connectedEntityId": "test",
"connectedEntityType": "testType"
}
]
}
При отправке дважды я ожидаю, что во второй раз ничего не будет обнаружено как «грязное» и, следовательно, не будет увеличена версия, однако это так.
При просмотре журналов Hibernate создается впечатление, что коллекция «соединений» загрязнена.
Как проверка «грязности» Hibernate определяет, загрязнена ли коллекция?
Пытался использовать Set вместо ArrayList — коллекция по-прежнему была грязной.
Пытался использовать сопоставление OneToMany — проблема была обратной — родительский объект никогда не обновлялся. Насколько я понимаю, это не лучший вариант, поскольку «Соединение» не является отдельной сущностью.
Пытался добавить сгенерированный идентификатор в сущность «Соединение» — коллекция все еще была грязной. .
Проверено, что все объекты реализуют метод равенства(), как и ожидалось.

Подробнее здесь: https://stackoverflow.com/questions/791 ... no-changes
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»