Вставка данных в базу данных H2 с помощью Spring Boot JPA на post

#java #spring #spring-boot #hibernate #h2

#java #spring #spring-boot #спящий режим #h2

Вопрос:

Я хочу сохранить данные в регистрационной форме из моего приложения Angular в H2 базу данных с помощью JPA spring boot. Но когда я выполняю post в Spring boot для сохранения пользовательских данных, я получаю a NullPointerException в строке, которая вызывает метод сохранения. Когда я просто возвращаю пользовательские данные обратно без сохранения данных, это работает нормально, но не при сохранении данных.

То table , что создается:

 Hibernate: 
    
    create table user (
       id integer not null,
        email varchar(255),
        first_name varchar(255),
        last_name varchar(255),
        password varchar(255),
        primary key (id)
    )
  

Мой entity :

 @Entity
public class User {

    @javax.persistence.Id
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String firstName;
    private String lastName;
    private String email;
    private String password;
    
    // getters, setters, and constructor, etc.
  

Мой repository :

 @Repository
@Transactional
public class JPAUserRepository implements UserRepository {

    @Autowired
    private EntityManager em;

    @Override
    @Transactional
    public void save(User user) {
        em.createNativeQuery("INSERT INTO user (id, first_name, email, last_name, password)"  
                "VALUES (?,?,?,?,?)")
                .setParameter(1, user.getId())
                .setParameter(2, user.getFirstName())
                .setParameter(3, user.getEmail())
                .setParameter(4, user.getLastName())
                .setParameter(5, user.getPassword())
                .executeUpdate();
    }
  

Контроллер, на котором я обрабатываю post:

 @RestController
public class Register {

private JPAUserRepository jpaUserRepository;

    @PostMapping(path = "/api/register", consumes = "application/json")
    public String addUser(@RequestBody User user) {

        jpaUserRepository.save(user);
        return "succesfull add";
    }
  

В репозитории я тоже пробовал em.persist(user) , но это дало ту же ошибку.

Комментарии:

1. Почему вы используете @javax.persistence.Id and @Id одновременно?

Ответ №1:

Не уверен, откуда именно берется ваша ошибка. Но что я замечаю: вы вставляете своего пользователя с предоставленным идентификатором, однако в нем указано @Generated в объекте — поэтому идентификатор должен быть сгенерирован, а не предоставлен. С Spring Boot у вас обычно будет такой репозиторий:

 public interface UserRepository extends CrudRepository<User, Integer> {
}
  

Вам не нужны никакие дополнительные методы — при вызове UserRepository.save(..) Пользователь будет сохранен.
Я бы рекомендовал посмотреть на https://bootify .ввод-вывод и создание запущенного приложения, чтобы вы могли проверить, чего не хватает, также с точки зрения конфигурации.

Комментарии:

1. Спасибо! использовал Bootify, зная это раньше, это могло бы сэкономить мне много времени, хахах

Ответ №2:

Не похоже, что вы вводите репозиторий в свой контроллер Register REST?

 @Autowired private JPAUserRepository jpaUserRepository;
  

Ответ №3:

Я думаю, что проблема может быть в трех вещах.

  1. Вы генерируете идентификатор ( @GeneratedValue ) и снова устанавливаете его вручную и
  2. использование @javax.persistence.Id и @Id .
  3. EntityManger должно быть введено как @PersistenceContext

Итак,

 @Override
@Transactional
public void save(User user) {
    em.createNativeQuery("INSERT INTO user (first_name, email, last_name, password)"  
            "VALUES (?,?,?,?)")
            .setParameter(1, user.getFirstName())
            .setParameter(2, user.getEmail())
            .setParameter(3, user.getLastName())
            .setParameter(4, user.getPassword())
            .executeUpdate();
}
  

ИЛИ гораздо удобнее использовать репозитории jpa напрямую, как указано Томасом.