Запись и обновление данных в БД Spring Data JPA
У меня есть задача:
1.Нужно сохранить в БД сущности. Мой метод saveAll() он работает!
public List<ValuteCursEntity> saveAll() throws Exception {
return valuteCursRepository.saveAll(xmlParser.getValuteCursEntity());
}
НО
- Нужно после этого сделать проверку на дату создания таблицы (Если дата равна текущей, то не обновлять таблицу, а если нет то обновить и перезаписать данные, которые записались в методе 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 шт):
Вы меняете только данные. Таблицу за вас создает 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);
}