작성자 없음
작성자 정보가 삭제된 글입니다.
작성
·
573
0
<BookForm>
@Getter @Setter
public class BookForm {
private Long id;
private String name;
private int price;
private int stockQuantity;
private String author;
private String isbn;
}
<Controller>
@PostMapping("/items/new")
public String create(BookForm form){
Book book = new Book();
book.setName(form.getName());
book.setPrice(form.getPrice());
book.setStockQuantity(form.getStockQuantity());
book.setAuthor(form.getAuthor());
book.setIsbn(form.getIsbn());
itemService.saveItem(book);
return "redirect:/";
}
<Service>
@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class ItemService {
private final ItemRepository itemRepository;
public void saveItem(Item item){
itemRepository.save(item);
}
public Item findOne(Long itemId){
return itemRepository.findOne(itemId);
}
public List<Item> findAll(){
return itemRepository.findAll();
}
}
<Repository>
@Repository
@RequiredArgsConstructor
@Slf4j
public class ItemRepository {
private final EntityManager em;
public void save(Item item){
if(item.getId() == null){
log.info("item={}", item);
em.persist(item); //신규등록
}else{
em.merge(item);
}
}
public Item findOne(Long id){
return em.find(Item.class, id);
}
public List<Item> findAll(){
return em.createQuery("select i from Item i", Item.class)
.getResultList();
}
}
<Log>
2023-04-21 15:08:16.380 INFO 7536 --- [nio-8080-exec-2] j.jpashop2.repository.ItemRepository : item=Book(author=qwe, isbn=1234)
<Test>
로그에 찍히는거 보면 값이 다 전달이 되고 테스트 코드에서도 성공으로 떠서 저장이 되야 될거 같은데 h2 db에 가면 값이 저장이 안되어 있네요
아예 디비랑 연동이 안되나 싶었는데 멤버는 정상적으로 회원가입이 되는데 아이템만 저장이 안되네요 뭐가 문제일까요...
ddl-auto 는 create로 되어있구요 h2 db 버전은 1.4.2 입니다
답변 1
2
안녕하세요.. 저도 같은 문제가 발생해서 거의 두 시간째 고민을하다가 겨우 문제를 찾았습니다.
ItemService class에 기본적으로 Transactional Annotation의 옵션이 readonly로 들어가있는데요.
save의 경우에는 read가 아니기 때문에 Transactional Annotation 의 옵션이 빠져야합니다.
따라서
@Transactional
public void saveItem(Item item){
itemRepository.save(item);
}
이렇게 saveItem 함수 위에 @Transactional 을 별도로 붙여주면 해결이 됩니다.
저도 허겁지겁 코드를 치면서 강의를 보느라 놓쳤네요.. 부디 이걸로 해결되시길 바랍니다.
저도 1시간 정도 해맸는데 감사합니다!!