#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:
Я думаю, что проблема может быть в трех вещах.
- Вы генерируете идентификатор (
@GeneratedValue
) и снова устанавливаете его вручную и - использование
@javax.persistence.Id
и@Id
. 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 напрямую, как указано Томасом.