【问题标题】:JPA Mapping for table having more than two foreign keys具有两个以上外键的表的 JPA 映射
【发布时间】:2019-02-04 16:29:56
【问题描述】:

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

这是我的 3 个主表的实体

以下是“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 Data 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】:

    首先,您的数据库设计不正常。您现在正在为每个人的地址重复一个人的薪水。你应该有两个连接表,一个在人员和薪水之间,一个在人员和地址之间。或者更好的是,因为没有一个关系是多对多的,所以使用连接列。

    其次,使用 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)
    

    【讨论】:

    • 正如我所说,这不完全是我的问题。我尝试使用 4 个示例表来复制该场景。
    • 无论如何,如果您希望能够创建有意义的映射,则需要弄清楚表格的正常形式。
    猜你喜欢
    • 2014-10-12
    • 2022-01-16
    • 2021-07-01
    • 1970-01-01
    • 2013-03-20
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多