아래의 Item 클래스와 Movie 클래스를 생성하고, 상속관계 매핑의 조인전략 사용 시 Movie 테이블에 INSERT 구문이 실행되지 않는 상황이 있었다.

Item.java

@Entity
@Getter
@Setter
@Inheritance(strategy = InheritanceType.JOINED)
public class Item {

    @Id
    @GeneratedValue
    @Column(name = "ITEM_ID")
    private Long id;

    private String name;
    private int price;
    private int stockQuantity;

}

Movie.java

@Entity
@Getter
@Setter
public class Movie extends Item {

    private String director;
    private String actor;
}

JpaMain.java

public class JpaMain {

    public static void main(String[] args) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();
        tx.begin();

        try {

            Movie movie = new Movie();
            movie.setDirector("aaa");
            movie.setActor("bbbb");
            movie.setName("바람과함께사라지다");
            movie.setPrice(10000);
            movie.setStockQuantity(13);

            em.persist(movie);

            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            em.close();
        }
        emf.close();
    }
}

image

image

INSERT 구문이 Item 클래스만 생성되는 이유를 찾다보니, 놀랍게도 h2 데이터베이스와 Hibernate버전의 호환과 관련된 문제였다.

    <dependencies>
        <!-- JPA 하이버네이트 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.3.10.Final</version>
        </dependency>
        <!-- H2 데이터베이스 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.200</version>
        </dependency>
    </dependencies>

이렇게 1.4.200 버전의 h2 데이터베이스를 사용할 때, 해당 h2 버전을 지원하지 않는 Hibernate 버전을 사용하면 테이블 INSERT 구문이 생성되지 않는다거나 테이블 DROP 되지 않는 버그가 발생한다(이 프로젝트의 경우 테이블 생성 옵션은 create).

해결방법은 h2 버전을 낮추던지, 아니면 h2 버전은 냅두고 Hibernate 버전을 올리는 방법이 있다.

나의 경우, Hibernate 버전을 5.3.10에서 5.4.13로 변경했다.

변경 후, 결과를 살펴보자.

image

image

Movie 테이블에도 INSERT 구문이 생성되고, 데이터도 잘 들어갔다.


추가적으로, 다음과 같이, em.find를 통해 데이터를 조회할 때에도, 위의 버전 호환 문제를 해결하지 않으면, SELECT 구문이 발생하지 않는다.

public class JpaMain {

    public static void main(String[] args) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();
        tx.begin();

        try {

            Movie movie = new Movie();
            movie.setDirector("aaa");
            movie.setActor("bbbb");
            movie.setName("바람과함께사라지다");
            movie.setPrice(10000);
            movie.setStockQuantity(13);

            em.persist(movie);

            em.flush();
            em.clear();

            Movie findMovie = em.find(Movie.class, movie.getId());
            System.out.println("findMovie = " + findMovie);

            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            em.close();
        }
        emf.close();
    }
}

image

Leave a comment