java - JPA:使用附加属性映射多对多关系

标签 java hibernate jpa orm spring-data-jpa

我在Employee之间有多对多关系和SkillSet表,每个关系都有附加列 numberOfYears

employeeId  skillSetId  numberOfYears 
10          101         2

我是 JPA 新手,无法定义具有关系的实体。我应该为 Employee_SkillSet 定义一个新的实体类吗? table ?或者我可以在 Employee 中定义多对多关系吗?和SkillSet类(class)?我在哪里指定numberOfYears列?

编辑:似乎重复,但我明确要求使用 @IdClass ,其中一个实体是 @MappedSuperclass ,因此必须定义 ID 实例和引用的实体对象。

最佳答案

由于您需要元组(Employee、SkillSet)的附加字段,因此您必须创建另一个实体。

@Entity
public class Employee implements Serializable {
    private @Id Long id;

    @OneToMany(mappedBy="employee")
    private List<EmployeeSkillSet> skillSets;
}

@Entity
public class SkillSet implements Serializable {
    private @Id Long id;
}

@Entity
public class EmployeeSkillSet implements Serializable {
    private @Id Long id;
    private @ManyToOne Employee employee;
    private @ManyToOne SkillSet skillSet;
    private @Basic int numberOfYears;
}

当然,您可以选择使用 @IdClass 使 ("employee", "skillSet") 作为 EmployeeSkillSet 的主键,如下所示:

@Entity @IdClass(EmployeeSkillSet.Key.class)
public class EmployeeSkillSet implements Serializable {

    private @Id @ManyToOne Employee employee;
    private @Id @ManyToOne SkillSet skillSet;
    private @Basic int numberOfYears;

    public static class Key implements Serializable {
        private Long employee; // plus getter+setter
        private Long skillSet; // plus getter+setter
        // plus hashCode, equals
    }
}

关于java - JPA:使用附加属性映射多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34004718/

相关文章:

Java - 布局管理器选择

java - 如何使用单选按钮在单个 JSP 页面上显示多个问题

java - 重写方法而不扩展 (java)

java - MySQL 和 Spring Boot : lost connections after some interval of inactivity

java - 如何更新外键列?

Java - 多线程一个大循环

java - 如何从 JPA EntityManager 清除 Hibernate 缓存?

java - 使用 jpa 和 hibernate 在 orm.xml 中定义命名查询

hibernate - 选择的事务策略需要访问 JTA TransactionManager 或 Unable to build EntityManagerFactory

java - 如何处理 JPA 多对一关系?