java - 当 "parent"表具有复合 PK 时,如何在 JPA 中建模一对一关系?

标签 java hibernate jpa one-to-one natural-key

虽然有很多关于如何建模的信息,但在 JPA (2) 中,一对一关系 OR 具有自然键的实体,我无法找到一个清晰/简单的答案来说明如何对我们同时拥有的情况进行建模,即一对-父表具有自然键的一种关系。很明显,我可能错过了这样的教程;如果是这样,给我指出一个也可能是答案。

而且,对于 JPA 和像我这样的菜鸟,当需要比最基本的模型多一点的时候,很快就会碰壁。

因此,考虑以下数据库模型:

enter image description here

相应的 JPA 注释对象模型是什么? (因为我不想影响答案,所以我不会让你们知道我尝试过的事情......)

也欢迎提出性能建议(例如“一对多可以执行得更快”等)!

谢谢,

最佳答案

复合标识符由两个数字列构成,因此映射如下所示:

@Embeddable
public class EmployeeId implements Serializable {

    private Long companyId;

    private Long employeeId;

    public EmployeeId() {
    }

    public EmployeeId(Long companyId, Long employeeId) {
        this.companyId = companyId;
        this.employeeId = employeeId;
    }

    public Long getCompanyId() {
        return companyId;
    }

    public Long getEmployeeId() {
        return employeeId;
    }

    @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(getEmployeeId(), that.getEmployeeId());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getCompanyId(), getEmployeeId());
    }
}

父类,如下所示:

@Entity(name = "Employee")
public static class Employee {

    @EmbeddedId
    private EmployeeId id;

    private String name;

    @OneToOne(mappedBy = "employee")
    private EmployeeDetails details;

    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;
    }

    public EmployeeDetails getDetails() {
        return details;
    }

    public void setDetails(EmployeeDetails details) {
        this.details = details;
    }
}

child 是这样的:

@Entity(name = "EmployeeDetails")
public static class EmployeeDetails {

    @EmbeddedId
    private EmployeeId id;

    @MapsId
    @OneToOne
    private Employee employee;

    private String details;

    public EmployeeId getId() {
        return id;
    }

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

    public Employee getEmployee() {
        return employee;
    }

    public void setEmployee(Employee employee) {
        this.employee = employee;
        this.id = employee.getId();
    }

    public String getDetails() {
        return details;
    }

    public void setDetails(String details) {
        this.details = details;
    }
}

一切正常:

doInJPA(entityManager -> {
    Employee employee = new Employee();
    employee.setId(new EmployeeId(1L, 100L));
    employee.setName("Vlad Mihalcea");
    entityManager.persist(employee);
});

doInJPA(entityManager -> {
    Employee employee = entityManager.find(Employee.class, new EmployeeId(1L, 100L));
    EmployeeDetails employeeDetails = new EmployeeDetails();
    employeeDetails.setEmployee(employee);
    employeeDetails.setDetails("High-Performance Java Persistence");
    entityManager.persist(employeeDetails);
});

doInJPA(entityManager -> {
    EmployeeDetails employeeDetails = entityManager.find(EmployeeDetails.class, new EmployeeId(1L, 100L));
    assertNotNull(employeeDetails);
});
doInJPA(entityManager -> {
    Phone phone = entityManager.find(Phone.class, "012-345-6789");
    assertNotNull(phone);
    assertEquals(new EmployeeId(1L, 100L), phone.getEmployee().getId());
});

代码可用 GitHub .

关于java - 当 "parent"表具有复合 PK 时,如何在 JPA 中建模一对一关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38696214/

相关文章:

hibernate - NoClassDefFoundError 与 Spring maven hibernate org/hibernate/ejb/HibernatePersistence

java - 在 Spring Boot 2.1 中重写 Hibernate ConnectionProvider

java - Hibernate JPA 持久保存父 ID 为空的子实体

tomcat - 尝试使用 JPA 从数据库读取数据时出现 java.lang.NullPointerException

java - 如何保护 Class.forName("com.mysql.jdbc.Driver)?

java - 为什么Java内部类需要 "final"外部实例变量?

mysql - Spring boot - 通过SQL插入数据后自增问题

java - 如何与JPA查询这种一对一的关系

java - hibernate 查询基于子字符串查找记录

java - 三角学和角度收敛