ERROR(13)
-
JPA 에러: save the transient instance before flushing
개인 프로젝트의 테스트 코드에서 위와 같은 에러가 발생했다. 오브젝트가 저장되지 않은 인스턴스를 참조하고 있다는 메시지로 보인다. 검색 결과 FK 로 사용되는 컬럼에 값이 없는 상태에서 데이터를 넣으려다 발생한 에러인 듯 싶다. 예를 들어 멤버(id, name, team_id), 팀(id, name)의 테이블에서 팀의 데이터가 없는 채로 멤버의 데이터를 넣으려고 하면 위의 에러가 발생한다는 뜻이다. 이 경우 멤버를 영속상태로 만들때 팀도 자동으로 영속화해주는 Cascade 옵션을 사용해 해결이 가능하다. 상품(Item) 1 : N ItemCategory N : 1 카테고리(Category) 의 테이블에서 @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType..
2022.06.07 -
No entity found for query 에러
서비스 계층에서, 회원 가입 시 입력한 아이디와 같은 ID를 사용중인지 체크하고자 한다. 위의 코드는 리포지토리에서 작성한 코드인데, No entity found for query 에러가 발생했다. 이는 쿼리문이 잘못되었다기 보다는 동일한 ID를 가진 엔티티가 없어서, getSingleResult()에서 에러가 발생한 것으로 보인다. getSingleResult()는 결과가 null일 경우 따로 처리를 해주어야 한다. Optional을 사용하는 것이 null체크 코드보다 깔끔하므로 아래와 같이 코드를 수정했다. public Optional findMemberByLoginId(String loginId){ List members = em.createQuery("select m from Member m wh..
2022.06.01 -
@PostConstruct와 no EntityManager
에러 메시지 Caused by: javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call 웹 개발중 테스트 데이터를 매 실행마다 입력하기 번거로워서 jpa: hibernate: ddl-auto: create update로 변경할까 하다가, 그냥 애플리케이션이 실행할때마다 샘플 데이터를 저장하기로 했다. 일단 트랜잭션이 걸려있는 Service 단에서 sampleData 메소드를 작성했다. 빈 생성(여기서는 해당 코드가 있는 Service 클래스)과 의존관계 주입이 완료된 다음, sa..
2022.05.31 -
Could not autowire. No beans of 'EntityManager' type found.
Spring, JPA를 실습중인데, 테스트 코드를 작성하다가 제목과 같은 에러가 발생했다. 주입을 하려면 스프링으로 관리하는 Bean이 되어야 하는데, JPA와 스프링은 각자의 방식(영속성 컨텍스트와 스프링 컨테이너)으로 빈을 관리하거나 엔티티를 관리한다. JPA는 EntityManager라는 인터페이스를 주입할 때 고유의 injection annotation이 존재한다. @PersistenceContext EntityManager em; 지금까지 @Autowired로 문제없이 주입했던 것 같은데,, 앞으로는 위의 어노테이션을 사용해야겠다. 물론 @Autowired로 EntityManager를 주입받아도 테스트는 통과했다.. 참고한 링크 https://stackoverflow.com/questions/2..
2022.05.30 -
Loading class 'com.mysql.jdbc.Driver'. This is deprecated. The new driver class is 'com.mysql.cj.jdbc.Driver'.
이전 포스팅에서 MySQL Jdbc의 Driver를 등록했었다. 이후 간단한 테스트 코드를 실행하였는데 제목과 같은 경고문이 발생했다. com.mysql.jdbc.Driver 클래스의 사용을 지양하라는 경고문인데, 메시지에 잘 나와있듯 com.mysql.cj.jdbc.Driver로 변경하니 경고문은 사라졌다. jdbc DriverManager 인터페이스가 변경된 듯 하다. 관련 내용은 https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-usagenotes-connect-drivermanager.html MySQL :: MySQL Connector/J 8.0 Developer Guide :: 7.1 Connecting to MySQL Using the JD..
2022.05.18 -
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
OS: Window 10 IDE: Intelli J 아래의 코드에서 제목과 같은 에러가 발생했다. Class.forName("com.mysql.cj.jdbc.Driver"); MySQL의 JDBC Driver를 찾지 못해 발생하는 에러다. 해결을 위해 1. Driver 파일인 mysql-connector-java-8.0.13.jar을 JRE의 library-ext디렉토리에 복사하였다. C:\Users\user\Downloads\sqldeveloper-20.4.1.407.0006-x64\sqldeveloper\jdk\jre\lib\ext (본인 pc의 해당 디렉토리에 가서 복사-붙여넣기) 만약 jar파일이 없다면 아래 링크에서 다운로드 해야 한다. http://dev.mysql.com/downloads/c..
2022.05.18