Я использую Spring boot 2.0.3.RELEASE(FINCHLEY)
`starter-data-jpa 2.0.5.RELEASE.
Сценарий довольно простой, создайте сущность и сохраните ее.
Давайте разберем код для лучшего контекста, прежде чем перейти к текстам.
Класс сущности (Asset)
: идентификатор (первичный ключ) не генерируется автоматически, потому что мы в основном получаем уникальный UUID.toString()
из другого источника, который, безусловно, уникален.
import lombok.*;
import org.springframework.data.domain.Persistable;
import javax.persistence.*;
import java.util.List;
@Setter
@Getter
@ToString
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "ASSET", schema = "SCHEMA")
public class Asset implements Persistable<String> {
// Propriety code hence column names removed.
//Let's just assume column names are fine, since when I am doing a find(), results are cool
private static final long serialVersionUID = 1L;
@Id
private String id;
private String creditPool;
private int quantity;
private int assetStatusTypeId;
private long assetTypeId;
private int ageOfAsset;
//The below snippet is part of Persistable<String> to force a new entry. Newly added following an answer in stackoverflow.
//Here, update is basically false by default,
//so as you can see isNew() will always return true forcing jpa to save a new record
@Transient
private boolean update;
@Override
public String getId() {
return this.id;
}
@Override
public boolean isNew() {
return !this.update;
}
}
Согласно комментариям, которые я добавил, вы видите, что я добавил этот фрагмент, потому что мы не генерируем id
.
.
Без сниппета и Persistable проблема та же между прочим.
Мой пользовательский класс репозитория имеет следующую настраиваемую функцию сохранения по деловым причинам.
@Override
public <S extends T> S save(S entity, long value) {
entity.someParams(args getting from from a jar) //which is really fine
return super.save(entity);
}
Код, с которого вызывается save
, ниже
Asset asset = Asset.builder()
.id(UUID.randomId().toString()) //see always unique
.assetStatusTypeId(a valid id)
.assetTypeId(a valid id)
.creditPool("pool")
.quantity(integer value)
.ageOfAsset(integer value).build();
repo.save(asset);
Я проверял компоновщик несколько раз, и он действительно создает Asset
объект без сбоев.
Но преступник save
никогда не будет казнен.
Я включил showSQL:true
, чтобы проверить, вызывается ли запрос вставки или нет. Но я не вижу таких запросов.
Спящие свойства:
jpa:
show-sql: true
properties:
hibernate:
enable_lazy_load_no_trans: true
show_sql: true
format_sql: true
jdbc:
batch_size: 5
Я рассмотрел сценарий, в котором даже со всеми безопасными проверками JPA может рассматривать его как сценарий обновления,
Я проигнорировал сохранение и также использовал persist
. Даже тогда без вставки.
repo.persist(asset);
Пожалуйста, помогите в этом.
stackoverflow Исходники для моих обходных путей и дубликаты.
Любая помощь по этому вопросу будет принята с благодарностью.