使用 Spring 在 post 上启动 JPA 将数据插入 H2 数据库
Insert data in H2 database with Spring Boot JPA on post
我想使用 JPA
spring 引导将注册表单上的数据从我的 Angular 应用程序保存到 H2
数据库。
但是当我执行 post 到 Spring 引导以保存用户数据时,我在调用保存方法的行上得到了 NullPointerException
。当我只是 return 返回用户数据而不保存数据时它工作正常,但在保存数据时却不行。
创建的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)
,但出现了同样的错误。
不确定您的错误究竟来自何处。但我注意到:
您正在使用提供的 ID 插入您的用户,但是它在实体中声明 @Generated - 因此应该生成 ID 而不是提供 ID。
使用 Spring 引导,您通常会有这样的存储库:
public interface UserRepository extends CrudRepository<User, Integer> {
}
您不需要任何额外的方法 - 通过调用 userRepository.save(..) 将保留一个用户。
我建议查看 https://bootify.io 并创建一个 运行 应用程序,这样您就可以在配置方面检查缺少的内容。
您似乎没有将 repo 注入到 Register REST 控制器中?
@Autowired private JPAUserRepository jpaUserRepository;
我认为可能是三件事。
- 您正在生成 ID(
@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();
}
或者如 Thomas 所述直接使用 jpa repos 非常方便。
我想使用 JPA
spring 引导将注册表单上的数据从我的 Angular 应用程序保存到 H2
数据库。
但是当我执行 post 到 Spring 引导以保存用户数据时,我在调用保存方法的行上得到了 NullPointerException
。当我只是 return 返回用户数据而不保存数据时它工作正常,但在保存数据时却不行。
创建的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)
,但出现了同样的错误。
不确定您的错误究竟来自何处。但我注意到: 您正在使用提供的 ID 插入您的用户,但是它在实体中声明 @Generated - 因此应该生成 ID 而不是提供 ID。 使用 Spring 引导,您通常会有这样的存储库:
public interface UserRepository extends CrudRepository<User, Integer> {
}
您不需要任何额外的方法 - 通过调用 userRepository.save(..) 将保留一个用户。 我建议查看 https://bootify.io 并创建一个 运行 应用程序,这样您就可以在配置方面检查缺少的内容。
您似乎没有将 repo 注入到 Register REST 控制器中?
@Autowired private JPAUserRepository jpaUserRepository;
我认为可能是三件事。
- 您正在生成 ID(
@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();
}
或者如 Thomas 所述直接使用 jpa repos 非常方便。