[JPA] persistence.xml 설정

해니·2023년 6월 13일
0

JPA

목록 보기
2/8
post-thumbnail




[ 오류 상황 🚫]


1 ) UnknownEntityTypeException: Unable to locate persister



        EMF.init();
        EntityManager em = EMF.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        
        try {
            tx.begin();
            Review review = new Review("H-01", 5, "작성자", "댓글");
            em.persist(review);
            
            ... 
            
        }

  • em.persist(review); 에서 오류 발생
  • java.lang.IllegalArgumentException: Unknown entity --> 엔티티를 못 찾고 있는 것으로 추정
  • persistence.xml 파일에 엔티티가 위치하는 코드를 추가적으로 입력해야 함

2 ) java.sql.SQLSyntaxErrorException: Table 'TableName' doesn't exist

  • 신규 테이블 생성이 되지 않아 발생하는 오류였음
  • 데이터베이스 스키마 자동 생성되도록 persistence.xml 속성 추가하여 해결함








persistence.xml 파일이란?

  • 엔티티를 사용하는 EJB 3.0 application 프로그램에서 (하나 이상의) persistence-units 설정하는 파일
    • JPA는 EJB entity에서 시작하여 그 설정정보를 그대로 가져온다.
  • persistence.xmlresources/META-INF 경로에 있으면 jpa가 자동으로 인식한다.

1 ) Entity class 설정


 <persistence-unit name="jpabegin" transaction-type="RESOURCE_LOCAL">
 
        <class>jpabasic.reserve.domain.User</class>
        <class>jpabasic.reserve.domain.Hotel</class>
        <class>jpabasic.reserve.domain.Review</class>
        <class>jpabasic.reserve.domain.AccessLog</class>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        
        ...
        
 </persistence-unit>
  • exclude-unlisted-classestrue로 설정하면 <class>xx</class>로 명시한 클래스만 엔티티로 로딩한다. false이면 CLASSPATH에서 자동 탐색한다.

  • 현재 Hibernate가 Java 클래스와 persistence.xml Resource가 존재하는 Classpath가 다를 경우 Entity 자동인식을 못한다. 따라서 명시가 더 확실할 수 있다.



2) hibernate.hbm2ddl.auto

 <properties>
 		<property name="hibernate.hbm2ddl.auto" value="create"></property>
 </properties>
   

  • 데이터베이스 스키마 자동 생성
    - DDL을 애플리케이션 실행 시점에 자동 생성한다.
    - 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성한다. (개발 단계에서만 사용)

    • 생성된 DDL은 운영서버에서는 사용하지 않거나, 적절히 다듬은 후 사용한다.

  • 속성 종류

    • create : 기존 테이블 삭제 후 다시 생성 DROP + CREATE
    • create-drop : create와 같지만 종료시점에 테이블 DROP (테이블 아예 삭제함)
    • update : 변경분만 반영(운영DB에는 사용하면 안된다), 추가만 된다. 지워지는건 안됨.
    • validate : 엔티티와 테이블이 정상 매핑되었는지만 확인
    • none : 사용하지 않음

  • 주의사항

    • 운영 장비에는 절대 create, create-drop, update 사용하면 안된다.
    • 개발 초기 단계는 create 또는 update
    • 테스트 서버는 update 또는 validate
    • 스테이징과 운영 서버는 validate 또는 none





데이터베이스 방언이란? 🧑🏼‍💻

  • 스프링 JPA를 사용하여 데이터베이스를 접근 및 관리하는 경우 어플리케이션이 직접 JDBC 레벨에서 SQL 을 작성하는 것이 아니라 JPA 가 직접 SQL 을 작성하고 실행하는 원리이다.

  • 개발자가 사용하기로 결정한 RDBMS 마다 ANSI SQL를 표준으로 두고 있지만 자신만의 독자적인 기능을 가지며 이를 방언(Dialect)이라고 한다.

    • 데이터 타입, 함수명,페이징 처리 등 다양한 부분에서 차이가 발생하게 된다.
    • 기존에 Oracle DB 을 데이터베이스로 사용하다가 고객의 요구에 따라 MS-SQL 에 맞게 추가로 개발하려는 상황이라면 막대한 비용이 든다.. !
  • 하이버네이트를 포함한 대부분의 JPA 구현체들은 이런 문제를 해결하기 위해 다양한 데이터베이스 방언 클래스를 제공한다.

    • 개발자는 스프링 JPA가 제공하는 표준 문법에 맞추어 개발을 하면 되고 특정 데이터베이스에 의존적인 SQL 은 설정한 데이터베이스 방언이 처리해준다.
  • Hibernate 데이터베이스 방언 종류

    • H2 : org.hibernate.dialect.H2Dialect
    • Oracle 10g : org.hibernate.dialect.Oracle10gDialect
    • MySQL : org.hibernate.dialect.MySQL5InnoDBDialect
    // persistence.xml
    
     <persistence-unit name="jpabegin" transaction-type="RESOURCE_LOCAL">
        <properties>
          	<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
        </properties>
     </persistence>
    
    






출처
[JPA/Hibernate] persistence.xml 설정 방법 https://atoz-develop.tistory.com/entry/JPAHibernate-persistencexml-%EC%84%A4%EC%A0%95-%EB%B0%A9%EB%B2%95
JPA persistence.xml Setting https://kha0213.github.io/jpa/jpa-persistence.xml/
JPA Error just for purpose of providing stack trace https://kha0213.github.io/jpa/jpa-error-pk/
exception just for purpose of providing stack trace https://tjdwns4537.tistory.com/55
4. [springboot] hibernate.hbm2ddl.auto 속성 정리 https://dkyou.tistory.com/14
persistence.xml 설정 https://ultrakain.gitbooks.io/jpa/content/chapter2/chapter2.5.html
https://kwonnam.pe.kr/wiki/java/jpa/persistence.xml
[Spring JPA ] 데이터베이스 방언(Dialect) 이란? https://velog.io/@choidongkuen/

profile
💻 ⚾️ 🐻

0개의 댓글