Сущность с двумя FK для одного и того же лица - PullRequest
0 голосов
/ 18 февраля 2019

У меня назначена система встреч, и у меня возникли проблемы со структурой mysql и структурой модели.Будет два типа пользователей (по крайней мере): клиент и поставщик.Клиенты будут назначать встречи для выбранной работы с доступным поставщиком для этой работы.Поставщики смогут добавлять себя, чтобы выбрать работу, которая будет доступна для клиентов.Наконец, будет назначена встреча с датой начала, датой окончания и внешними ключами для customer_id и provider_id (от пользователей таблицы) и work_id (от работы таблицы).Таким образом, в таблице встреч у меня будет 2 FK для одного и того же лица (пользователя), но один будет клиентом, а другой - провайдером.Какое отображение должны иметь поля пользователя и клиента в классе назначений и назначения полей в классе пользователей?Я буду дифференцировать пользователей по роли с таблицей users_role.Возможно ли сделать это только с одной общей таблицей для пользователей?

вот ссылка на схему mysql: https://i.imgur.com/OdKfVdh.png

Appointment.class

@Entity
@Table(name="appointments")
public class Appointment extends BaseEntity {

    @Column(name="start")
    @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm")
    private LocalDateTime start;

    @DateTimeFormat(pattern="yyyy-MM-dd'T'hh:mm")
    @Column(name="end")
    private LocalDateTime end;

    @ManyToOne
    @JoinColumn(name="work_id")
    private Work work;

    ??????
    private User customer; 

    ??????
    private User provider;
}

User.class:

@Entity
@Table(name="users")
public class User extends BaseEntity {

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

    @Column(name = "username")
    private String userName;

    @Column(name = "password")
    private String password;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @Column(name = "email")
    private String email;

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "users_roles", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Collection<Role> roles;

    ??????
    private List<Appointment> appointments;

    @ManyToMany
    @JoinTable(name="works_providers", joinColumns=@JoinColumn(name="id_user"), inverseJoinColumns=@JoinColumn(name="id_work"))
    private List<Work> works;

}

1 Ответ

0 голосов
/ 18 февраля 2019

Вам просто нужно указать имена столбцов:

@OneToMany    
@JoinColumn(name = "first_column")
private User customer; 

@OneToMany    
@JoinColumn(name = "second_column")
private User user;

в родительском sidy обратитесь к потомку:

@ManyToOne(mappedBy = "user")
private List<Appointment> appointmentsByUser;

@ManyToOne(mappedBy = "customer")
private List<Appointment> appointmentsByProvider;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...