java – 如何在同一数据库表上映射两个JPA或Hibernate实体
发布时间:2020-12-14 16:25:39 所属栏目:Java 来源:网络整理
导读:在我们的项目中,我们有一个实体“餐厅”,有近30个字段(一些与其他实体有关系).所以,每次我们需要一个“餐厅”对象即使是几个字段,所有其他的都被检索.这会影响性能.所以在HBM文件中,我们写了两个指向同一物理类和同一个数据库表的类,如下所示. === restauran
在我们的项目中,我们有一个实体“餐厅”,有近30个字段(一些与其他实体有关系).所以,每次我们需要一个“餐厅”对象即使是几个字段,所有其他的都被检索.这会影响性能.所以在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”吗?如果那么,上述标准如何返回“餐厅”对象? 解决方法
这个主题以及如何使用它来进行延迟提取的属性,它描述了很好的细节
in this article.
总结一下,以下映射将演示如何将多个实体映射到同一个数据库表中: @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."); }); } > PostSummary只是您原始实体的只读视图,因此我用@Immutable注释它. 此测试也可在GitHub. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |