在 H2 数据库中插入数据,并在 Spring Boot JPA 发布



我想使用 Spring 启动将注册表单上的数据从我的 Angular 应用程序保存到JPAH2数据库中。 但是当我发布到 Spring 引导以保存用户数据时,我在调用 save 方法的行上得到一个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();
}

我处理帖子的控制器:

@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)但给出了相同的错误。

不确定您的错误究竟来自哪里。但我注意到的是: 您正在使用提供的 ID 插入用户,但它在实体中声明@Generated - 因此应生成 ID 而不是提供 ID。 使用 Spring Boot,您通常会有一个这样的存储库:

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

你不需要任何额外的方法 - 通过调用userRepository.save(..),用户将被持久化。 我建议查看 https://bootify.io 并创建一个正在运行的应用程序,这样您就可以在配置方面检查缺少的内容。

看起来您没有将存储库注入到您的寄存器 REST 控制器中?

@Autowired private JPAUserRepository jpaUserRepository;

我认为有三件事可能是问题所在。

  1. 您正在生成 id(@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 存储库非常方便,如Thomas所述。

相关内容

最新更新