У меня в приложении Spring разные типы пользователей. Я реализовал какое-то наследование. Все типы пользователей расширяются от класса User. Я думаю, что здесь должно быть достаточно двух таблиц:
- таблица «пользователи» - содержит столбцы для всех атрибутов общего объекта
- таблица "users_corporate" - содержит столбцы для атрибутов класса CorporateCustomer: companyName и VatNumber
«пользователи» будут иметь: идентификатор, имя пользователя, пароль, имя, фамилию, фамилию, адрес электронной почты, мобильный телефон, город, улицу, почтовый индекс
"users_corporate" будет иметь: company_name, vat_number
Class RetailCustomer и Provider не имеют полей с аннотацией @Column, поэтому для них нет необходимости иметь таблицу, мне нужно только объявить поля с сопоставлениями OneToMany.
Теперь мне интересно, как hibernate будет отличать Provider и RetailCustomer друг от друга, если у меня нет аннотации @Table в их классе. Когда я буду использовать репозиторий Spring Data и, например, вызывать providerRepository.findAll (), как теперь будет, какие строки из таблицы «users» являются провайдерами, а какие - retailCustomer? Это будет работать? Я что-то упустил?
BaseEntity:
@MappedSuperclass
public class BaseEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
}
Пользователь:
@Entity
@Table(name="users")
@Inheritance(strategy = InheritanceType.JOINED)
public class User extends BaseEntity{
@Column(name = "username")
private String userName;
@Column(name = "password")
private String password;
@Column(name = "email")
private String email;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "users_roles", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
private Collection<Role> roles;
}
CorporateCustomer:
@Entity
@Table(name="users_corporate")
public class CorporateCustomer extends User{
@Column(name = "company_name")
private String companyName;
@Column(name = "vat_number")
private String vatNumber;
@OneToMany(mappedBy = "customer")
private List<Appointment> appointments;
}
RetailCustomer:
@Entity
//@Table <---- i think it is not needed here?
public class RetailCustomer extends User {
@OneToMany(mappedBy = "customer")
private List<Appointment> appointments;
}
Поставщик:
@Entity
//@Table <---- i think it is not needed here?
public class Provider extends User{
@OneToMany(mappedBy = "provider")
private List<Appointment> appointments;
@ManyToMany
@JoinTable(name="works_providers", joinColumns=@JoinColumn(name="id_user"), inverseJoinColumns=@JoinColumn(name="id_work"))
private List<Work> works;
@OneToOne(mappedBy="provider", cascade = {CascadeType.ALL})
private WorkingPlan workingPlan;
}