Похоже, что репозиторий Spring JPA не спасает и не выдает никаких исключений. - PullRequest
0 голосов
/ 26 марта 2019

Я использую 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 Исходники для моих обходных путей и дубликаты. Любая помощь по этому вопросу будет принята с благодарностью.

1 Ответ

0 голосов
/ 26 марта 2019

Вы должны сбросить после сохранения или напрямую использовать saveAndFlush (актив).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...