gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:47:27 28 4
gpt4 key购买 nike

在我们的项目中,我们有一个实体“餐厅”,其中包含近 30 个字段(有些与其他实体有关系)。因此,每次我们需要一个“Restaurant”对象时,即使是几个字段,也会检索所有其他字段。这会影响性能。所以,在 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 实现中,我们使用的 Criteria 采用“RestaurantLite”并返回如下所示的餐厅列表。

Criteria criteria = session.createCriteria("RestaurantLite");

// criteria related stuff

return new LinkedHashSet<Restaurant>(criteria.list());

现在我们要删除所有 hbm 文件并使用注释。那么如何使用实体的注释来完成相同的操作呢?我们是否需要创建一个额外的类“RestaurantLite”?如果是这样,上述条件如何返回 'Restaurant' 对象??

最佳答案

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

@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 只是原始实体的只读 View ,因此我用 @Immutable 对其进行了注释。

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

此测试也可在 GitHub 上进行.

关于java - 如何在同一个数据库表上映射两个 JPA 或 Hibernate 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29007676/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com