Отношение много к одному с унаследованными объектами - Postgres - PullRequest
1 голос
/ 08 марта 2019

Я создаю приложение, в котором мне нужна одна страница входа. Однако есть два «типа» пользователей: клиенты и тренеры. Мой домен выглядит так:

      User
        |
  +-----+-----+
  |           |
Person     Trainer

Мой пользователь будет содержать электронную почту, пароль и т. Д., Чтобы я мог использовать эту таблицу для проверки запросов на вход.

Тренер должен хранить список людей, и у человека должен быть 1 тренер.

Работает один ко многим, тренер может хранить список объектов класса Person, но я не могу связаться с тренером через клиента.

Это мой класс пользователя:

package com.example.demo.model;

import javax.persistence.*;

@Entity
@Inheritance
@Table(name="users")
public abstract class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String email;

    public User(){}

    public User(String email) {
        this.email = email;
    }


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

Класс Person:

package com.example.demo.model;

import javax.persistence.*;

@Entity
public class Person extends User {

    @Column
    private int age;

    @ManyToOne
    @JoinColumn
    private Trainer trainer;

    public Person(){}

    public Person(String email, int age) {
       super(email);
        this.age = age;
    }
}

Класс тренера:

package com.example.demo.model;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
public class Trainer extends User {

    @Column
    private String description;

    @OneToMany(mappedBy = "trainer", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Person> clients;

    public Trainer(){}

    public Trainer(String email, String description) {
        super(email);
        this.description = description;
    }

    public void addClient(Person person){
        this.clients = new ArrayList<>();
        this.clients.add(person);
    }
}

Как мне получить доступ к тренеру клиента через аннотацию ManyToOne? Или есть другие варианты? Заранее спасибо!

1 Ответ

1 голос
/ 08 марта 2019

Не инициализировать список в addClient().Вы перезаписываете / удаляете существующих клиентов.Сделайте это в объявлении поля.

@OneToMany(...)
private List<Person> clients = new ArrayList<>();

Установите обе стороны отношения:

public void addClient(Person person){
    person.setTrainer(this);
    this.clients.add(person);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...