如何在同一个数据库表上映射两个JPA或Hibernate实体

在我们的项目中,我们有一个实体’餐厅’,有近30个领域(有些与其他实体有关系)。 因此,每当我们需要“餐馆”对象时,即使是几个字段,也会检索所有其他对象。 这会影响性能。 因此,在HBM文件中,我们编写了两个指向同一物理类和相同数据库表的类,如下所示。

=== restaurant.hbm.xml ===          

在其中一个DAO实现中,我们使用Criteria,它采用’RestaurantLite’并返回餐馆列表,如下所示。

 Criteria criteria = session.createCriteria("RestaurantLite"); // criteria related stuff return new LinkedHashSet(criteria.list()); 

现在我们要删除所有hbm文件并使用注释。 那么如何使用针对entites的注释来做同样的事情呢? 我们需要创建一个额外的’RestaurantLite’课程吗? 如果那时,上述标准如何返回’餐厅’对象?

本主题以及如何将其用于延迟提取属性, 本文将详细介绍它。

总结一下,以下映射将演示如何将多个实体映射到同一个数据库表:

 @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."); }); } 
  1. PostSummary只是对原始实体的只读视图,因此我使用@Immutable对其进行了@Immutable

  2. UpdatablePostSummary标有@DynamicUpdate ,因此您也可以从此View实体传播更改。

此测试也可在GitHub上获得 。

你必须在你的类上添加注释@ Entity,@ Table(name =“RESTAURANT”),添加注释并在hbm文件中替换你的详细映射

这是一个完整的例子: http : //viralpatel.net/blogs/hibernate-many-to-many-annotation-mapping-tutorial/