• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

updateItem질문입니다.

23.05.04 18:02 작성 23.05.04 18:08 수정 조회수 499

0

@PostMapping("/items/{id}/edit")
public String updateItem(@PathVariable Long id, @ModelAttribute Item item) {
    Item findItem = itemService.findById(item.getId());

    //더티 체킹
    findItem.setId(item.getId());
    findItem.setName(item.getName());
    findItem.setPrice(item.getPrice());
    findItem.setStockQuantity(item.getStockQuantity());
    findItem.setAuthor(item.getAuthor());
    findItem.setIsbn(item.getIsbn());

    return "redirect:/items";
}

 

강의를 보지 않고 스스로 코드를 짜보고 있는데 이렇게 하니까 수정내역이 반영 되지 않더라구요 스스로 생각해봤을 때는 다음 2가지 이유 중 하나일 것 같은데 이유가 이유가 무엇인가요 ㅠㅠ?

  1. findItem은 영속성 컨텍스트가 관리하지 않는 객체가 된 것이다. 따라서 더티체킹이 되지 않는다.

     

  2. 영속성 컨텍스트가 관리하는 엔티티는 맞지만 Controller에는 트랜잭션이 없어서 반영이 안되는 것이다.

 

답변 1

답변을 작성해보세요.

1

David님의 프로필

David

2023.05.05

안녕하세요. hjemsti님, 공식 서포터즈 David입니다.

스프링의 경우 OSIV가 기본적으로 켜져(on)있기 때문에 트랜잭션 범위를 벗어나도 컨트롤러에서도 영속성 컨텍스트가 유지됩니다. 다만, 트랜잭션을 벗어난 상태에서는 영속성 컨텍스트가 유지되지만 더티체킹은 동작하지 않습니다.

감사합니다.