Мы обнаружили, что сущности, которые мы определяли как типы ElementCollection, не имели определенного метода equals
или hashcode
и имели пустые поля.Мы предоставили их (через @lombok, что это стоит) для типа сущности, и это позволило hibernate (v 5.2.14) определить, что коллекция была или не была грязной.
Кроме того, эта ошибка возникла у наспотому что мы были в методе обслуживания, который был помечен аннотацией @Transaction(readonly = true)
.Поскольку hibernate будет пытаться очистить коллекцию связанных элементов и вставить ее заново, транзакция завершится неудачно при сбросе, и что-то не получится с этим очень трудным для отслеживания сообщением:
HHH000346: Error during managed flush [Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1]
Вот пример нашей модели сущностей, в которой произошла ошибка
@Entity
public class Entity1 {
@ElementCollection @Default private Set<Entity2> relatedEntity2s = Sets.newHashSet();
}
public class Entity2 {
private UUID someUUID;
}
Изменение ее на эту
@Entity
public class Entity1 {
@ElementCollection @Default private Set<Entity2> relatedEntity2s = Sets.newHashSet();
}
@EqualsAndHashCode
public class Entity2 {
@Column(nullable = false)
private UUID someUUID;
}
Исправлена наша проблема.Удачи.