[SPRING] Spring MVC에서 자동 생성 ID
SPRINGSpring 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.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와 같은 일부 보조 추상화를 정의하고 양식 처리 또는 응답 어셈블 링에 사용하십시오.
from https://stackoverflow.com/questions/36388919/auto-generate-id-in-spring-mvc by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 서블릿으로 Spring Ioc 설정하기 (0) | 2019.05.13 |
---|---|
[SPRING] Hibernate와 Spring을 사용하는 JPA는 Jboss에서 설정 한 여러 데이터베이스 / 데이터 소스에 접근한다. (0) | 2019.05.13 |
[SPRING] Play-Framework 2.4 : Juice 대신 Play Framework를 사용하여 스프링 종속성 삽입 사용 (0) | 2019.05.13 |
[SPRING] `Long을 Spring 5에서 Example <S>`로 변환 할 수 없다. JPA findOne () (0) | 2019.05.13 |
[SPRING] @RequestMapping 정규 표현식 (0) | 2019.05.13 |