Весенние данные сохраняют обновления ID в ноль - PullRequest
0 голосов
/ 02 октября 2018

Я просто пытаюсь выполнить обновление объекта.Однако hibernate пытается 2 оператора SQL, один для правильного обновления, а второй - для нежелательного обновления одного только идентификатора до нуля, что приводит к сбою приложения.

Я использую Spring Data вместе с Hibernate и при выполнении обновленияобъекта, я вижу, что ожидаемое обновление SQL выполняется, однако при запуске приложения с SQL Server предпринимается попытка последующего обновления, которое выполняет следующие действия:

update my_table set id=null where id=?

Это, очевидно, не удается.

Cannot update identity column 'ID'.

Запуск того же кода с H2 Я не вижу, это второе обновление запущено.

Есть идеи, что может быть причиной этого поведения?

Я расширяю JpaRepository и использую по умолчаниюsave ().

Вот фрагмент моей сущности:

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

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String anotherValue;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    @JoinColumn(name="id")
    private List<ChildEntity> children = new ArrayList<>();

// getters, builder, private default constructor ...

Фрагмент, строящий мою сущность:

MyEntity.newBuilder()
                .withId(id)
                .withAnotherValue(valueUpdate)
                .build();

Хранилище:

public interface MyRepository extends JpaRepository<MyEntity, Long>

Экономия:

myRepository.save(myUpdatedEntity);

1 Ответ

0 голосов
/ 03 октября 2018

Поскольку я думаю о вероятной причине этого, если вы связываете два объекта с их идентификаторами в качестве внешних ключей, то hibernate может попытаться обновить идентификатор родителя в качестве внешнего ключа другого объекта.Неправильный способ связывания.

В отношении «один ко многим» добавьте внешний ключ в объект «многие стороны», который должен ссылаться на первичный ключ класса объекта «одна сторона».

@Entity
public class MyEntity {
    ..

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    @JoinColumn(name="id", referencedColumnName = "MYENTITY_ID")
    private List<ChildEntity> children = new ArrayList<>();

}
...