将一个实体映射到多个表

时间:2018-11-16 08:56:56

标签: hibernate spring-boot jpa spring-data-jpa

请假设我们的数据库中有两个表:

人员

id,名字,姓氏,titleid(是title.id的缩写)

标题

id,name

现在,我们需要在Spring Boot项目中使用jparepository类的实体或Java类:

人员

id,名字,姓氏,titleid, titleName (可能是@transient ?!) 在我们的人员实体中,字段id,名字,姓氏,titleid映射到人员表  并且titleName映射到标题表。

第一个问题:我们需要使用一个联合查询(在一个查询中)向我们的实体加载,但是所有保存,删除查询都像往常一样针对个人表。这怎么可能? 第二个问题是如何编写命名查询并在jparepository中使用它来仅加载id和firstname而忽略其他字段?

谢谢

2 个答案:

答案 0 :(得分:0)

使用@OneToOne映射

因此在您的人员课程中使用

@OneToOne 私人标题标题;

答案 1 :(得分:0)

您可以使用@Table@SecondaryTable批注将两个表都映射到Person实体。我在此written Hibernate Tipthis video中对此进行了详细说明。

此映射需要两个简单的步骤:

  1. 您需要使用JPA的@Table来注释您的实体, @SecondaryTable注释,并提供第一个和第二个的名称 第二个表作为名称参数的值。您还可以在这两个表之间指定连接列。
  2. 您需要注释要映射到辅助表的每个属性 带有@Column注释,并将辅助表的名称设置为 table属性的值。

根据问题中提到的表格,您的映射应如下所示:

@Entity
@Table(name = "person")
@SecondaryTable(name = "title", pkJoinColumns = @PrimaryKeyJoinColumn(name = "titleid", referencedColumnName = "id"))
public class Person {

    @Id
    @GeneratedValue
    private Long id;

    private String firstName;

    private String lastName;

    @Column(table = "title", name = "name")
    private String titleName;

    ...
}