Встраиваемые отношения - PullRequest
0 голосов
/ 10 января 2020

Может ли кто-нибудь помочь мне с простым объяснением того, как использовать @Embeddable?

У меня такая ситуация ниже!

Одна компания имеет несколько сотрудников, а моя таблица сотрудников имеет 2 идентификатора поля (register_number и name)

Это правильный подход?

@Entity
@Table(name = "COMPANY")
public class Company implements Serializable {

    private static final long serialVersionUID = 1L;

    @EmbeddedId
    private Employee employeeId;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
    @GenericGenerator(name = "native", strategy = "native")
    @Column(name = "ID", unique = true, nullable = false, precision = 38)
    private Long id;

    @Column(name = "NAME", nullable = false, length = 50)
    private String name;

    @ToString.Exclude
    @EqualsAndHashCode.Exclude
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "registerNumber")
    private Set<Employee> employees;
}

//

@Embeddable
@Entity
@Table(name = "EMPLOYEE")
public class Employee implements Serializable {

    private static final long serialVersionUID = 1L;

    @Column(name = "REGISTER_NUMBER", nullable = false, length = 100)
    private String registerNumber;

    @Column(name = "NAME", nullable = false, length = 50)
    private String name;

    @Column(name = "EMAIL", nullable = false, length = 50)
    private String email;
}

1 Ответ

0 голосов
/ 10 января 2020

Я думаю, что вы ищете способ поддержки составного ключа с помощью Hibernate. Вы должны переместить эти поля в новый класс и пометить этот класс с помощью @Embeddable.
Для классов, упомянутых в вопросе, создайте новый Embeddable class EmployeeIdClass с полями (registerNumber и name) и укажите переменную для объекта этого класса в Employee, аннотируйте его @ EmbeddedId .

EmployeeIdClass

@Embeddable
public class EmployeeIdClass implements Serializable{

    @Column(name = "REGISTER_NUMBER", nullable = false, length = 100)
    private String registerNumber;

    @Column(name = "NAME", nullable = false, length = 50)
    private String name;

    public String getRegisterNumber() {
        return registerNumber;
    }

    public void setRegisterNumber(String registerNumber) {
        this.registerNumber = registerNumber;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        EmployeeIdClass that = (EmployeeIdClass) o;
        return Objects.equals(registerNumber, that.registerNumber) &&
                Objects.equals(name, that.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(registerNumber, name);
    }
}

Employee

@Entity
@Table(name = "EMPLOYEE")
public class Employee implements Serializable {

    private static final long serialVersionUID = 1L;

    @EmbeddedId
    @Column(name = "employeeId", nullable = false, length = 50)
    private EmployeeIdClass employeeId;

    @Column(name = "EMAIL", nullable = false, length = 50)
    private String email;

    public String getEmail() {
        return email;
    }

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

    public EmployeeIdClass getEmployeeId() {
        return employeeId;
    }

    public void setEmployeeId(EmployeeIdClass employeeId) {
        this.employeeId = employeeId;
    }
}

Company

@Entity
@Table(name = "COMPANY")
public class Company implements Serializable {

    private static final long serialVersionUID = 1L;

//    @EmbeddedId
//    private Employee employeeId;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
    @GenericGenerator(name = "native", strategy = "native")
    @Column(name = "ID", unique = true, nullable = false, precision = 38)
    private Long id;

    @Column(name = "NAME", nullable = false, length = 50)
    private String name;

//    @ToString.Exclude
//    @EqualsAndHashCode.Exclude
    @OneToMany(fetch = FetchType.LAZY)
    private Set<Employee> employees;

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<Employee> getEmployees() {
        return employees;
    }

    public void setEmployees(Set<Employee> employees) {
        this.employees = employees;
    }
}

CompanyEmployeeTest

public class CompanyEmployeeTest {
    public static void main(String[] args) {
        EmployeeIdClass employeeIdClass2 = new EmployeeIdClass();
        employeeIdClass2.setName("b");
        employeeIdClass2.setRegisterNumber("2");
        EmployeeIdClass employeeIdClass3 = new EmployeeIdClass();
        employeeIdClass3.setName("c");
        employeeIdClass3.setRegisterNumber("3");

        Employee emp2 = new Employee();
        emp2.setEmail("b@");
        Employee emp3 = new Employee();
        emp3.setEmail("c@");
        emp2.setEmployeeId(employeeIdClass2);
        emp3.setEmployeeId(employeeIdClass3);

        Company company = new Company();
        Set<Employee> set = new HashSet<>();
        set.add(emp2);
        set.add(emp3);
        company.setEmployees(set);
        company.setName("first-company");
        company.setId(1234l);

        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();

        session.save(company);
        session.save(emp3);
        session.save(emp2);

        transaction.commit();
        session.close();
    }
}

Queries ran by Hibernate

Hibernate: create table COMPANY (ID bigint not null auto_increment, NAME varchar(50) not null, primary key (ID)) engine=MyISAM
Hibernate: create table COMPANY_EMPLOYEE (Company_ID bigint not null, employees_NAME varchar(50) not null, employees_REGISTER_NUMBER varchar(100) not null, primary key (Company_ID, employees_NAME, employees_REGISTER_NUMBER)) engine=MyISAM
Hibernate: create table EMPLOYEE (NAME varchar(50) not null, REGISTER_NUMBER varchar(100) not null, EMAIL varchar(50) not null, primary key (NAME, REGISTER_NUMBER)) engine=MyISAM
Hibernate: alter table COMPANY_EMPLOYEE add constraint UK_lnmh1scqoa65gxcryjyeroyj unique (employees_NAME, employees_REGISTER_NUMBER)
Hibernate: alter table COMPANY_EMPLOYEE add constraint FKkkjhj0prbvia5yiqebnefkkb5 foreign key (employees_NAME, employees_REGISTER_NUMBER) references EMPLOYEE (NAME, REGISTER_NUMBER)
Hibernate: alter table COMPANY_EMPLOYEE add constraint FKivik2ern4s4074u9eb3c6u7jw foreign key (Company_ID) references COMPANY (ID)
Hibernate: insert into COMPANY (NAME) values (?)
Hibernate: insert into EMPLOYEE (EMAIL, NAME, REGISTER_NUMBER) values (?, ?, ?)
Hibernate: insert into EMPLOYEE (EMAIL, NAME, REGISTER_NUMBER) values (?, ?, ?)
Hibernate: insert into COMPANY_EMPLOYEE (Company_ID, employees_NAME, employees_REGISTER_NUMBER) values (?, ?, ?)
Hibernate: insert into COMPANY_EMPLOYEE (Company_ID, employees_NAME, employees_REGISTER_NUMBER) values (?, ?, ?)
...