복붙노트

[SPRING] Spring MVC에서 자동 생성 ID

SPRING

Spring MVC에서 자동 생성 ID

데이터베이스 (Postgres) 내에서 JSP 페이지에 의해 수집 된 데이터를 저장하려고합니다. 처음에는 어떤 값을 수동으로 (id 포함) 폼에 삽입하려고 시도 했었고 db에 데이터를 저장하는 데 아무런 문제가 없었습니다. 이제 자동으로 id 값을 생성하려고 시도하지만 올바르게 수행하는 방법에 대해 약간 혼란 스럽습니다.

내 모델 - 제품

public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String description;
    private double price;
    @DateTimeFormat(pattern = "dd/MM/yyyy")
    private Date date;

    public Product() { }

    public Product(Long id, String description, double price, Date date) {
        this.id = id;
        this.description = description;
        this.price = price;
        this.date = date;
    }
    //getters and setters
}

내 컨트롤러 - DBConnection

@Controller
public class DBConnection {

    @Autowired
    private ProductDao prDao;

    @RequestMapping(value = "/newproduct", method = RequestMethod.GET)
    public ModelAndView showForm() {
        Product product = new Product();
        return new ModelAndView("newproduct", "product", product);
    }

    @RequestMapping(value = "/newproduct", method = RequestMethod.POST)
    public ModelAndView submitForm(@ModelAttribute("product") Product product) {
        ModelAndView mav = new ModelAndView();

        prDao.addProduct(product.getId(), product.getDescription(), product.getPrice(), product.getDate());
        mav.setViewName("product");
        mav.addObject("product", product);
        return mav;
    }
}

ProductDaoImpl

public class ProductDaoImpl implements ProductDao {
    private DataSource dataSource;
    private JdbcTemplate jdbcTemplate;

    @Override
    public void setDataSource(DataSource ds) {
        this.dataSource = ds;
        this.jdbcTemplate = new JdbcTemplate(dataSource);

    }

    @Override
    public void addProduct(Long id, String description, double price, Date date) {
        jdbcTemplate.update("INSERT INTO products values(?, ?, ?, ?)", id, description, price, date);
    }
}

newproduct.jsp의 내 양식

<form:form method="POST" action="newproduct" modelAttribute="product">
    <table>
        <tr>
            <td><form:label path="description">Description</form:label></td>
            <td><form:input path="description" /></td>
        </tr>
        <tr>
            <td><form:label path="price">Price</form:label></td>
            <td><form:input path="price" /></td>
        </tr>
        <tr>
            <td><form:label path="date">Date (dd/mm/yyyy)</form:label></td>
            <td><form:input path="date" /></td>
        </tr>
        <tr>
            <td><input type="submit" value="Submit" /></td>
        </tr>
    </table>
</form:form>

양식을 제출할 때 오류가 발생했습니다.

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [INSERT INTO products values(?, ?, ?, ?)]; ERROR: null values in column "id" violates not-null constraint
  Detail: The row contains error (null, nnvfe, 10.00, 2010-10-10).; nested exception is org.postgresql.util.PSQLException: ERROR: null values in column "id" violates not-null constraint
  Detail: The row contains error (null, nnvfe, 10.00, 2010-10-10).

문제는 addProduct 메소드에 있다고 생각합니다. ID 값은 아직 가져 오지 못했을 때 생성되지 않았습니다.

어떻게 자동으로 생성 된 ID를 구현할 수 있습니까? JPA 주석은 올바른 방법입니까?

해결법

  1. ==============================

    1.ID를 자동으로 생성하려면 null을 제공하더라도 ID를 제공하지 마십시오. 따라서 addProduect 메소드에서 id를 제거하십시오.

    ID를 자동으로 생성하려면 null을 제공하더라도 ID를 제공하지 마십시오. 따라서 addProduect 메소드에서 id를 제거하십시오.

    @Override
    public void addProduct(String description, double price, Date date) {
        jdbcTemplate.update("INSERT INTO products values(?, ?, ?)", description, price, date);
    }
    

    또한이 질문과 같이 ID 필드를 자동 증가 시키십시오.

    또는 addProduct 메소드를 변경하고 EntityManager # persist 메소드를 사용하십시오.

    @Override
    public void addProduct(Product product) {
        entityManager.persist(product);
    }
    

    오류 정보 :

    양식에서 클라이언트의 id 값을 가져 가지 않으므로 / newproduct 끝점은 id 값으로 null이있는 Product를 갖습니다.

    @RequestMapping(value = "/newproduct", method = RequestMethod.POST)
    public ModelAndView submitForm(@ModelAttribute("product") Product product) { ... }
    

    그런 다음이 null 값을 매개 변수로 addProduct 메소드에 전달합니다.

    prDao.addProduct(product.getId(), ...)
    

    마지막으로 addProduct는 Null 제약 조건이있는 기본 키의 값으로 Null 값을 저장하려고하므로 오류가 발생합니다.

    또한, 클라이언트와의 통신 수단으로서 Entity 객체를 사용한다. 제품, 좋은 연습이 아닙니다. Forms 또는 DTO와 같은 일부 보조 추상화를 정의하고 양식 처리 또는 응답 어셈블 링에 사용하십시오.

  2. from https://stackoverflow.com/questions/36388919/auto-generate-id-in-spring-mvc by cc-by-sa and MIT license