在我们的项目中,我们有一个实体“餐厅”,有近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.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。