Стратегии наследования в JPA

389
14 февраля 2017, 18:40

Всем привет!

Я новичок c JPA поэтому может вопрос для когото покажется банальным но мне всё же не понятно о создании самих таблиц провайдером, например в этом примере создаётся в таблици при использовании @Inheritance(strategy = InheritanceType.SINGLE_TABLE) следующии колонки : employee_id который является fk на id , сам Id как Primary пример на скрине ключ золотого цвета, manager_id как fk для id ..

  1. Зачем hibernate provider создаёт из этих колонок fk на id ?

  2. employee_id колонка которая создалась провайдером она не относится к полям моих классов, зачем создаётся данная колонка ?

  3. Что за ID как Primary золотой цвет ключа , разве id из класса Employee не Primary ?

Пример моего кода :

Employee:

@Entity
@Table (name = "employees")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "test" , discriminatorType = DiscriminatorType.STRING)
public class Employee {
public Employee(int id, String name, String lastname, double salary, String spec) {
    this.id = id;
    this.name = name;
    this.salary = salary;
    this.specialization = spec;
    this.lastname = lastname;
}
public int getId() {
    return id;
}
public String getName() {
    return name;
}
public double getSalary() {
    return salary;
}
public void setId(int id) {
    this.id = id;
}
public void setName(String name) {
    this.name = name;
}
public void setSalary(double salary) {
    this.salary = salary;
}
@Override
public String toString() {
    return "Employee{" +
            "id=" + id +
            ", name='" + name + '\'' +
            ", salary=" + salary +
            ", spec='" + specialization + '\'' +
            '}';
}
public String getLastname() {
    return lastname;
}
public void setLastname(String lastname) {
    this.lastname = lastname;
}
@Id
@Column(name = "id")
private int id;
@Column(name = "name")
private String name;
@Column(name = "lastname")
private String lastname;
@Column(name = "salary")
private double salary;
@Column (name = "specialization")
private String specialization;
public Manager getManager() {
    return manager;
}
public void setManager(Manager manager) {
    this.manager = manager;
}
@OneToOne(cascade = {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REMOVE}, fetch = FetchType.EAGER , mappedBy = "employee")
private Manager manager;
public Employee(){}
}

Manager:

 @Entity
 @DiscriminatorValue("M")
 public class Manager extends Employee{
public Manager(){}

public Set<Departments> getDepartment() {
    return department;
}
public void setDepartment(Set<Departments> department) {
    this.department = department;
}
public String getManager_country() {
    return manager_country;
}
public void setManager_country(String manager_country) {
    this.manager_country = manager_country;
}
public String getManager_address() {
    return manager_address;
}
public void setManager_address(String manager_address) {
    this.manager_address = manager_address;
}
public String getManager_experience() {
    return manager_experience;
}
public void setManager_experience(String manager_experience) {
    this.manager_experience = manager_experience;
}
@Override
public String toString() {
    return "Manager{" +
            "department=" + department +
            ", manager_address='" + manager_address + '\'' +
            ", manager_experience='" + manager_experience + '\'' +
            ", manager_country='" + manager_country + '\'' +
            ", id=" + id +
            '}';
}
@OneToMany(fetch = FetchType.EAGER , cascade = {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REMOVE} , mappedBy = "manager")
private Set<Departments> department;
@OneToOne
private Employee employee;
public Manager(String manager_experience,String manager_address, String manager_country) {
    this.manager_experience = manager_experience;
    this.manager_address = manager_address;
    this.manager_country = manager_country;
}
@Column(name = "experience")
private String manager_experience;
@Column(name = "address")
private String manager_address;
@Column(name = "country")
private String manager_country;
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "manager_id" ,insertable = false , updatable = false)
private int id;
}

Departments:

@Entity
@DiscriminatorValue("D")
public class Departments extends Manager{
public String getSales() {
    return sales;
}
public void setSales(String sales) {
    this.sales = sales;
}
public String getCostumer_support() {
    return costumer_support;
}
public void setCostumer_support(String costumer_support) {
    this.costumer_support = costumer_support;
}
public String getDevelopers() {
    return developers;
}
public void setDevelopers(String developers) {
    this.developers = developers;
}
public String getSystem_administrators() {
    return system_administrators;
}
public void setSystem_administrators(String system_administrators) {
    this.system_administrators = system_administrators;
}
public String getAccounting_department() {
    return accounting_department;
}
public void setAccounting_department(String accounting_department) {
    this.accounting_department = accounting_department;
}
@ManyToOne
private Manager manager;
@Column(name = "costumer_support_department" , unique = false, updatable = true , insertable = true , nullable = true)
private String costumer_support;
@Column(name = "developers_department" , unique = false, updatable = true , insertable = true , nullable = true)
private String developers;
@Column(name = "sys_admins_department" , unique = false, updatable = true , insertable = true , nullable = true)
private String system_administrators;
@Column(name = "accounting_department" , unique = false, updatable = true , insertable = true , nullable = true)
private String accounting_department;
@Column(name = "sales_department" , unique = false, updatable = true , insertable = true , nullable = true)
private String sales;
public Departments(){}
}
Answer 1

Зачем hibernate provider создаёт из этих колонок fk на id ?

Потому что у вас обозначены связи oneToMany, поэтому на них наложены ForeigKey

employee_id колонка которая создалась провайдером она не относится к полям моих классов, зачем создаётся данная колонка ?

Потому что вы не обозначили, поле по которой будет связка между Employee и Manager

READ ALSO
Синхронизация коллекций HashSet java

Синхронизация коллекций HashSet java

Есть две коллекции:

325
XSD Java: получить структуру

XSD Java: получить структуру

Всем добрый деньВстала задача из XSD получить результирующую структуру XML

378
Как импортировать библиотеку twoway-view?

Как импортировать библиотеку twoway-view?

Есть такая библиотека twoway-view которая позволяет создать кастомный recycler view как мне нужно

374
netty ArrayIndexOutOfBoundsException: 1

netty ArrayIndexOutOfBoundsException: 1

Добрый день! Я новичок в программировании, осваиваю java и netty 4Пишу небольшое клиент-серверное приложение с использованием netty

321