복붙노트

[SPRING] 동일한 데이터베이스 테이블에 두 개의 JPA 또는 Hibernate 엔티티를 매핑하는 방법

SPRING

동일한 데이터베이스 테이블에 두 개의 JPA 또는 Hibernate 엔티티를 매핑하는 방법

우리 프로젝트에는 약 30 개의 필드 (일부는 다른 개체와 관계가 있음)가있는 엔터티 '레스토랑'이 있습니다. 그래서 우리는 몇 개의 필드에 대해서도 'Restaurant'객체가 필요할 때마다 다른 모든 객체를 가져옵니다. 이것은 성능에 영향을줍니다. 그래서 HBM 파일에서 우리는 아래에 보여지는 것처럼 동일한 물리적 클래스와 동일한 데이터베이스 테이블을 가리키는 두 클래스를 작성했습니다.

=== restaurant.hbm.xml ===
<!-- Light Weight Version -->
<class name="com.raj.model.Restaurant" table="RESTAURANTS" entity-name="RestaurantLite" 
                dynamic-update="false" dynamic-insert="false">
<cache usage="read-only"/>
     <!-- few basic properties and relationships -->
</class>

<!-- Restaurant -->
<class name="com.raj.model.Restaurant" table="RESTAURANTS" entity-name="Restaurant">
     <!-- all properties and relationships -->
</class>

DAO 구현 중 하나에서 'RestaurantLite'를 가져와 아래 표시된 레스토랑 목록을 반환하는 기준을 사용하고 있습니다.

Criteria criteria = session.createCriteria("RestaurantLite");

   // criteria related stuff

return new LinkedHashSet<Restaurant>(criteria.list());

이제 모든 hbm 파일을 제거하고 주석을 사용하려고합니다. 그렇다면 엔테이션에 주석을 사용하여 어떻게 동일한 작업을 수행 할 수 있습니까? 'RestaurantLite'라는 추가 수업을 만들어야합니까? 그렇다면 위의 기준에 따라 '레스토랑'개체가 어떻게 반환됩니까?

해결법

  1. ==============================

    1.이 주제와 lazy 페치 속성에 대한 사용법은이 기사에서 자세히 설명합니다.

    이 주제와 lazy 페치 속성에 대한 사용법은이 기사에서 자세히 설명합니다.

    이를 요약하면 다음 매핑이 여러 엔터티를 동일한 데이터베이스 테이블에 매핑하는 방법을 보여줍니다.

    @Entity(name = "Post")
    public class Post {
    
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        private Long id;
    
        private String name;
    
        private String description;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getDescription() {
            return description;
        }
    
        public void setDescription(String description) {
            this.description = description;
        }
    }
    
    @Entity(name = "PostSummary")
    @Table(name = "Post")
    @Immutable
    public class PostSummary {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;
    
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    
    @Entity(name = "UpdatablePostSummary")
    @Table(name = "Post")
    @DynamicUpdate
    public class UpdatablePostSummary {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;
    
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    

    그리고 Hibernate는 잘 작동 할 것이다 :

    @Test
    public void testOneTableMultipleEntities() {
        doInTransaction(session -> {
            Post post = (Post) session.get(Post.class, 1L);
            PostSummary postSummary = (PostSummary) session.get(PostSummary.class, 1L);
            UpdatablePostSummary updatablePostSummary = (UpdatablePostSummary) session.get(UpdatablePostSummary.class, 1L);
            assertEquals(post.getName(), postSummary.getName());
            assertEquals(post.getName(), updatablePostSummary.getName());
            updatablePostSummary.setName("Hibernate Master Class Tutorial.");
        });
    }
    

    이 테스트는 GitHub에서도 가능합니다.

  2. ==============================

    2.당신은 클래스에 @tanetity, @Table (name = "RESTAURANT")을 추가하고, 주석을 추가하고, hbm 파일의 자세한 매핑을 바꿔야합니다. .

    당신은 클래스에 @tanetity, @Table (name = "RESTAURANT")을 추가하고, 주석을 추가하고, hbm 파일의 자세한 매핑을 바꿔야합니다. .

    다음은 완전한 예입니다 : http://viralpatel.net/blogs/hibernate-many-to-many-annotation-mapping-tutorial/

  3. from https://stackoverflow.com/questions/29007676/how-to-map-two-jpa-or-hibernate-entities-on-the-same-database-table by cc-by-sa and MIT license