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

问题描述 投票:0回答:1

下面是我的数据库,其中“table_relation”具有其他3个表“人,地址,工资”的外键

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

我为所有房产写过getter和setter。

我能够使用以下格式的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"
        }
    ]
}

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

任何帮助是极大的赞赏。

提前致谢。

java hibernate jpa spring-data-jpa hibernate-mapping
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.