[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.이 주제와 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.당신은 클래스에 @tanetity, @Table (name = "RESTAURANT")을 추가하고, 주석을 추가하고, hbm 파일의 자세한 매핑을 바꿔야합니다. .
당신은 클래스에 @tanetity, @Table (name = "RESTAURANT")을 추가하고, 주석을 추가하고, hbm 파일의 자세한 매핑을 바꿔야합니다. .
다음은 완전한 예입니다 : http://viralpatel.net/blogs/hibernate-many-to-many-annotation-mapping-tutorial/
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
'SPRING' 카테고리의 다른 글
[SPRING] 적절한 드라이버가 발견되지 않았습니다. (0) | 2019.01.31 |
---|---|
[SPRING] 웹 응용 프로그램에 shutDownHook 등록 (0) | 2019.01.30 |
[SPRING] classpath를 사용 : 봄 (0) | 2019.01.30 |
[SPRING] Spring Boot Application 클래스가 @Configuration annotation을 필요로하는 이유는 무엇입니까? (0) | 2019.01.30 |
[SPRING] TransactionRequiredException 업데이트 / 삭제 쿼리 실행 (0) | 2019.01.30 |