• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

상품 등록

23.04.21 15:22 작성 조회수 454

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>

캡처.JPG

로그에 찍히는거 보면 값이 다 전달이 되고 테스트 코드에서도 성공으로 떠서 저장이 되야 될거 같은데 h2 db에 가면 값이 저장이 안되어 있네요

아예 디비랑 연동이 안되나 싶었는데 멤버는 정상적으로 회원가입이 되는데 아이템만 저장이 안되네요 뭐가 문제일까요...

ddl-auto 는 create로 되어있구요 h2 db 버전은 1.4.2 입니다

 

 

 

답변 1

답변을 작성해보세요.

1

김종학님의 프로필

김종학

2023.04.29

안녕하세요.. 저도 같은 문제가 발생해서 거의 두 시간째 고민을하다가 겨우 문제를 찾았습니다.

 

ItemService class에 기본적으로 Transactional Annotation의 옵션이 readonly로 들어가있는데요.

save의 경우에는 read가 아니기 때문에 Transactional Annotation 의 옵션이 빠져야합니다.

따라서

    @Transactional
    public void saveItem(Item item){
        itemRepository.save(item);
    }

이렇게 saveItem 함수 위에 @Transactional 을 별도로 붙여주면 해결이 됩니다.

 

저도 허겁지겁 코드를 치면서 강의를 보느라 놓쳤네요.. 부디 이걸로 해결되시길 바랍니다.

yohan.cho님의 프로필

yohan.cho

2023.10.29

저도 1시간 정도 해맸는데 감사합니다!!