在我们的项目中,我们有一个实体“餐厅”,有近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注释它.
> UpdatablePostSummary标记为@DynamicUpdate,因此您也可以从此View实体传播更改.
此测试也可在GitHub.