У меня есть объект, который выглядит следующим образом:
Код: Выделить всё
@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