How to map a composite key with JPA and Hibernate?

前端 未结 8 1249
旧时难觅i
旧时难觅i 2020-11-22 10:37

In this code, how to generate a Java class for the composite key (how to composite key in hibernate):

create table Time (
     levelStation int(15) not null,         


        
8条回答
  •  野趣味
    野趣味 (楼主)
    2020-11-22 11:00

    As I explained in this article, assuming you have the following database tables:

    First, you need to create the @Embeddable holding the composite identifier:

    @Embeddable
    public class EmployeeId implements Serializable {
    
        @Column(name = "company_id")
        private Long companyId;
    
        @Column(name = "employee_number")
        private Long employeeNumber;
    
        public EmployeeId() {
        }
    
        public EmployeeId(Long companyId, Long employeeId) {
            this.companyId = companyId;
            this.employeeNumber = employeeId;
        }
    
        public Long getCompanyId() {
            return companyId;
        }
    
        public Long getEmployeeNumber() {
            return employeeNumber;
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (!(o instanceof EmployeeId)) return false;
            EmployeeId that = (EmployeeId) o;
            return Objects.equals(getCompanyId(), that.getCompanyId()) &&
                    Objects.equals(getEmployeeNumber(), that.getEmployeeNumber());
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(getCompanyId(), getEmployeeNumber());
        }
    }
    

    With this in place, we can map the Employee entity which uses the composite identifier by annotating it with @EmbeddedId:

    @Entity(name = "Employee")
    @Table(name = "employee")
    public class Employee {
    
        @EmbeddedId
        private EmployeeId id;
    
        private String name;
    
        public EmployeeId getId() {
            return id;
        }
    
        public void setId(EmployeeId id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    

    The Phone entity which has a @ManyToOne association to Employee, needs to reference the composite identifier from the parent class via two @JoinColumnmappings:

    @Entity(name = "Phone")
    @Table(name = "phone")
    public class Phone {
    
        @Id
        @Column(name = "`number`")
        private String number;
    
        @ManyToOne
        @JoinColumns({
            @JoinColumn(
                name = "company_id",
                referencedColumnName = "company_id"),
            @JoinColumn(
                name = "employee_number",
                referencedColumnName = "employee_number")
        })
        private Employee employee;
    
        public Employee getEmployee() {
            return employee;
        }
    
        public void setEmployee(Employee employee) {
            this.employee = employee;
        }
    
        public String getNumber() {
            return number;
        }
    
        public void setNumber(String number) {
            this.number = number;
        }
    }
    

    For more details, check out this article.

提交回复
热议问题