JPA Mapping для таблицы, имеющей более двух внешних ключей - PullRequest
0 голосов
/ 29 августа 2018

Ниже приведена моя база данных, где "table_relation" имеет внешний ключ трех других таблиц "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

Я написал геттеры и сеттеры для всех свойств.

Я могу получить данные из сущности "table_relation", используя данные пружины JPA в следующем формате

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

Я хочу получить "Person" со списком "Address" при поиске с помощью "Salary.amount" в следующем формате.

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

Может ли это быть достигнуто с помощью сопоставлений в провайдере и объектах адреса? Пожалуйста, направьте меня в достижении этого. Это копия моей первоначальной проблемы, но не сама проблема.

Любая помощь очень ценится.

Заранее спасибо.

1 Ответ

0 голосов
/ 29 августа 2018

Во-первых, ваш дизайн базы данных не в нормальной форме. Теперь вы повторяете зарплату для каждого из адресов. То, что вы должны иметь, это две таблицы соединения, одна между человеком и зарплатой, а другая между человеком и адресом. Или, что еще лучше, поскольку ни одно из этих отношений много-много, используйте столбец соединения.

Во-вторых, при использовании 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)
...