Код: Выделить всё
@Entity
@Table(name = "my_entity")
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "myEntitySeq")
@SequenceGenerator(name = "myEntitySeq", sequenceName = "my_entity_seq")
private Long id;
@OneToOne(optional = false)
@JoinColumn(name = "other_id")
private OtherEntity other;
@Column(nullable = false)
private String fieldA;
@Column(nullable = false)
private byte[] fieldB;
public MyEntity() {}
public MyEntity(OtherEntity other) {
this.other = other;
}
// public getter/setters for all fields...
}
Затем у меня есть транзакционный метод, который должен создать или обновить этот объект:
Код: Выделить всё
@Transactional
public void createOrUpdate(OtherEntity other, String fieldA, byte[] fieldB) {
var myEntity = myEntityRepository.findByOther(other)
// Create and get a new managed entity, missing fields will be updated right after:
.orElseGet(() -> entityManager.merge(new MyEntity(other)))
myEntity.setFieldA(fieldA);
myEntity.setFieldB(fieldB);
// Once the transaction ends I expect the new entity to be INSERTed, otherwise UPDATEd
}
Код: Выделить всё
fieldAНасколько я понимаю, поскольку SQL-запросы откладываются до конца транзакция, вызывающая сначала слияние для получения управляемого экземпляра с последующим обновлением состояния, будет правильно откладывать полную вставку в конце.
Вместо этого, похоже, откладывается неполная INSERT за которым следует UPDATE, который отключает ограничения базы данных NOT NULL для неполной вставки...
Удаление ограничения NOT NULL разрешает предыдущее код не дает сбоя, потому что он позволяет выполнить неполную вставку и каким-то образом также обновляет строку с установленными после нее свойствами. Но это означает, что моя схема базы данных допускает нулевые значения там, где они мне не нужны.
Я ошибаюсь, ожидая, что за этим последуют наборыentityManager.merge(...) сгруппировать все в один оператор INSERT? Ожидается ли, что при слиянии будет запланировано INSERT с состоянием, предоставленным на этом этапе, и только позднее UPDATE с использованием состояния, измененного позже в транзакции?
Подробнее здесь: https://stackoverflow.com/questions/784 ... -explicitl
Мобильная версия