java – 如何在同一数据库表上映射两个JPA或Hibernate实体
发布时间:2020-09-01 13:30:26 所属栏目:Java 来源:互联网
导读:在我们的项目中,我们有一个实体“餐厅”,有近30个字段(一些与其他实体有关系).所以,每次我们需要一个“餐厅”对象即使是几个字段,所有其他的都被检索.这会影响性能.所以在HBM文件中,我们写了两个指向同一物理类和同一个数据库表的类,如下所示. === restaurant
|
在我们的项目中,我们有一个实体“餐厅”,有近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. (编辑:十堰站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
