Java Spring JPA: почему он пытается вставить неинициализированную строку, когда я явно обновил управляемый объект?JAVA

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

Сообщение Anonymous »

Рассмотрим следующий объект:

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

@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
}
Но этот код завершается с ошибкой, говорящей, что он не может вставить новый объект, поскольку пытается вставить в таблицу нулевые поля ( и fieldB имеют значение null при вызове слияния, даже если я обновлю состояние позже).
Насколько я понимаю, поскольку SQL-запросы откладываются до конца транзакция, вызывающая сначала слияние для получения управляемого экземпляра с последующим обновлением состояния, будет правильно откладывать полную вставку в конце.
Вместо этого, похоже, откладывается неполная INSERT за которым следует UPDATE, который отключает ограничения базы данных NOT NULL для неполной вставки...
Удаление ограничения NOT NULL разрешает предыдущее код не дает сбоя, потому что он позволяет выполнить неполную вставку и каким-то образом также обновляет строку с установленными после нее свойствами. Но это означает, что моя схема базы данных допускает нулевые значения там, где они мне не нужны.
Я ошибаюсь, ожидая, что за этим последуют наборыentityManager.merge(...) сгруппировать все в один оператор INSERT? Ожидается ли, что при слиянии будет запланировано INSERT с состоянием, предоставленным на этом этапе, и только позднее UPDATE с использованием состояния, измененного позже в транзакции?

Подробнее здесь: https://stackoverflow.com/questions/784 ... -explicitl
Ответить

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

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

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

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

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