簡體   English   中英

使用 Spring Boot JPA 在 H2 數據庫中插入數據

[英]Insert data in H2 database with Spring Boot JPA on post

我想使用JPA spring boot 將注冊表中的數據從我的 Angular 應用程序保存到H2數據庫。 但是當我在 Spring boot 上發布帖子以保存用戶數據時,我在調用 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。 使用 Spring Boot,你通常會有一個這樣的存儲庫:

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

你不需要任何額外的方法 - 調用 userRepository.save(..) 一個用戶將被持久化。 我建議查看https://bootify.io並創建一個正在運行的應用程序,這樣您就可以在配置方面檢查缺少的內容。

看起來不像是將 repo 注入到 Register 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 repos 非常方便,如Thomas 所述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM