Запись и обновление данных в БД Spring Data JPA

У меня есть задача:

1.Нужно сохранить в БД сущности. Мой метод saveAll() он работает!

 public List<ValuteCursEntity> saveAll() throws Exception {
        return valuteCursRepository.saveAll(xmlParser.getValuteCursEntity());
    }

НО

  1. Нужно после этого сделать проверку на дату создания таблицы (Если дата равна текущей, то не обновлять таблицу, а если нет то обновить и перезаписать данные, которые записались в методе saveAll() )

Я попробовал реализовать такую логику

public List<ValuteCursEntity> saveAll() throws Exception {
        Date date = new Date();
        ValuteCursEntity valuteCursEntity = new ValuteCursEntity();
        valuteCursRepository.saveAll(xmlParser.getValuteCursEntity());
        if (valuteCursEntity.getCreated().before(date)){
            valuteCursRepository.saveAll(xmlParser.getValuteCursEntity());
        }
        return valuteCursRepository.findAll();
    }

Но бросает NullPointer.

Вот мои сущности:


@Data
@MappedSuperclass
@Getter
@Setter
public class BaseEntity {

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

    @CreationTimestamp
    @Column(name = "created")
    private Date created;
}

@Entity
@Data
@NoArgsConstructor
@Table(name = "base_currency")
public class ValuteCursEntity extends BaseEntity{

    @Column(name = "num_code")
    private int NumCode;

    @Column (name = "char_code")
    private String char_code;

    @Column(name = "nominal")
    private int nominal;

    @Column(name = "name")
    private String name;

    @Column(name = "value")
    private String value;

    public ValuteCursEntity(int numCode, String char_code, int nominal, String name, String value) {
        this.NumCode = numCode;
        this.char_code = char_code;
        this.nominal = nominal;
        this.name = name;
        this.value = value;
    }
}

И репозиторий

@Repository
public interface ValuteCursRepository extends JpaRepository<ValuteCursEntity, Long> {
}

Подскажите пожалуйста как с этим справиться, я первые дни знакомлюсь с JPA. Как добавить такую проверку? Спасибо!!!


Ответы (1 шт):

Автор решения: Z.John

Вы меняете только данные. Таблицу за вас создает Hibernate во время запуска. Когда вы делаете save или saveAll в repository проверяется если такая сущность есть то по вызывает entityManager.merge, если это новая сущность вызывается entityManager.persist - создается новая запись. Вот метод SimpleJpaRepository

/*
 * (non-Javadoc)
 * @see org.springframework.data.repository.CrudRepository#save(java.lang.Object)
 */
@Transactional
public <S extends T> S save(S entity) {

    if (entityInformation.isNew(entity)) {
        em.persist(entity);
        return entity;
    } else {
        return em.merge(entity);
    }
}

Проверка новая сущность или нет построено банально на наличии идентификатора в объекте. Цепочка в итоге приводит в AbstractPersistable

/**
 * Must be {@link Transient} in order to ensure that no JPA provider complains because of a missing setter.
 * 
 * @see org.springframework.data.domain.Persistable#isNew()
 */
@Transient // DATAJPA-622
public boolean isNew() {
    return null == getId();
}

Поэтому для вашего случая достаточно написать так

 public ValuteCursEntity save(ValuteCursEntity сurs) throws Exception {
    return valuteCursRepository.save(surs);
}

public List<ValuteCursEntity> saveAll(List<ValuteCursEntity> сurses) throws Exception {
    return valuteCursRepository.saveAll(surses);
}
→ Ссылка