如何在同一个数据库表上映射两个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."); }); }
-
PostSummary
只是对原始实体的只读视图,因此我使用@Immutable
对其进行了@Immutable
。 -
UpdatablePostSummary
标有@DynamicUpdate
,因此您也可以从此View实体传播更改。
此测试也可在GitHub上获得 。
你必须在你的类上添加注释@ Entity,@ Table(name =“RESTAURANT”),添加注释并在hbm文件中替换你的详细映射
。
这是一个完整的例子: http : //viralpatel.net/blogs/hibernate-many-to-many-annotation-mapping-tutorial/
- JBoss 5.1.0.GA中的Hibernate 3.5-Final
- 无法提交JPA事务:事务标记为rollbackOnly
- Spring @Transactional Annotation:自我调用
- 为什么spring / hibernate只读数据库事务比read-write运行得慢?
- 默认情况下,在Hibernate中为所有FetchType.LAZY非集合启用无代理行为
- Spring启动+ Spring数据JPA +二级缓存给出mutate错误
- 通过JPA注释更改类层次结构分支中的inheritance策略
- org.hibernate.hql.internal.ast.QuerySyntaxException:表未映射
- Spring引导JPA – JSON没有嵌套对象与OneToMany关系