具有两个以上外键的表的JPA映射

时间:2018-08-29 19:40:05

标签: java hibernate jpa spring-data-jpa hibernate-mapping

下面是我的数据库,其中“ table_relation”具有其他3个表的外键“ person,address,salary”

enter image description here

这是我的3个主表的实体

enter image description here

以下是“ table_relation”的实体

@Table(name="table_relation")
@Entity
public class TableRelationEntity {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private int id;

    @JoinColumn(name="person_id", referencedColumnName="person_id")
    @ManyToOne
    private PersonEntity person;

    @JoinColumn(name="address_id", referencedColumnName="address_id")
    @ManyToOne
    private AddressEntity address;

    @JoinColumn(name="salary_id", referencedColumnName="salary_id")
    @ManyToOne
    private SalaryEntity salary;

    //getters and setters

我已经为所有属性编写了吸气剂和吸气剂。

我可以使用以下格式的spring数据JPA从“ table_relation”实体中获取数据

{
    id: 1,
    person: { 
        id: 4,
        name: "name 1"
    },
    address: {
        id: 1,
        city: "city 1"
    },
    salary: {
        id: 1,
        amount: "100000"
    }
}

当我以以下格式用“ Salary.amount”搜索时,我想获得带有“地址”列表的“人”。

{ 
    id: 4,
    name: "name 1",
    address: [
        {
            id: 1,
            city: "city 1"
        },
        {
            id: 2,
            city: "city 2"
        }
    ]
}

这可以通过在提供者和地址实体中使用映射来实现吗?请指导我实现这一目标。这是我原来问题的复制,而不是问题本身的复制。

非常感谢您的帮助。

谢谢。

1 个答案:

答案 0 :(得分:0)

首先,您的数据库设计不是正常形式。您现在要为每个人员地址重复人员工资。您应该有两个联接表,一个在人与薪之间,一个在人与地址之间。甚至更好,因为没有很多关系,所以请使用联接列。

第二,使用JPA时,必须基于对象而不是数据库表进行建模。一个人有薪水,一个人与其薪水之间的关系不是具体的“事物”。

您的人实体应该看起来像这样:

@Entity
public class Person {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private int id;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "person_id")
    private List<Address> adresses = new ArrayList<>();

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "salary_id")
    private Salary salary;

    //setters, getters, etc
}

地址和薪水的实体无需更改。

对于表格,您应该具有:

Person(id, name, salary_id)
Address(id, city, person_id)
Salary(id, amount)