java - JPA 从多对一关系中获取值(value)

标签 java hibernate jpa

我在 JPA 中嵌入多对一关系中的单个值时遇到问题。下面是我用来初始化测试模式以及测试实体的一些代码。

这个想法是有一个表 EMPLOYEE 引用了表 RANK。表 RANK 又包含 RANK 的名称。每个员工都引用其级别。

当我尝试运行代码时,出现以下异常:

Caused by: org.hibernate.AnnotationException: SecondaryTable JoinColumn cannot reference a non primary key
    at org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:623)
    at org.hibernate.cfg.annotations.EntityBinder.bindJoinToPersistentClass(EntityBinder.java:764)
    at org.hibernate.cfg.annotations.EntityBinder.createPrimaryColumnsToSecondaryTable(EntityBinder.java:756)
    at org.hibernate.cfg.annotations.EntityBinder.finalSecondaryTableBinding(EntityBinder.java:684)
    at org.hibernate.cfg.SecondaryTableSecondPass.doSecondPass(SecondaryTableSecondPass.java:29)

这是一个数据库架构

CREATE TABLE RANK (
    ID INT NOT NULL, 
    NAME VARCHAR
);
ALTER TABLE RANK ADD PRIMARY KEY (ID);
INSERT INTO RANK (ID, NAME) VALUES (1, 'WORKER')

CREATE TABLE EMPLOYEE(
    ID INT NOT NULL, 
    NAME VARCHAR,
    RANK_ID INT NOT NULL
);
ALTER TABLE EMPLOYEE ADD PRIMARY KEY (ID);
INSERT INTO EMPLOYEE (ID, NAME, RANK_ID) VALUES (1, 'Bobby', 1);

最后,唯一的实体:

@Entity
@Table(name = "EMPLOYEE")
@SecondaryTable(name = "RANK", pkJoinColumns=@PrimaryKeyJoinColumn(name="ID", referencedColumnName = "RANK_ID"))
public class Employee {

    @Id
    @Column(name = "id")
    @GeneratedValue(generator = "increment")
    @GenericGenerator(name = "increment", strategy = "increment")
    private int id;

    @Column(name = "NAME")
    private String name;

    @Column(name = "RANK_ID")
    private int rankId;

    @Column(name = "name", table = "RANK")
    private String rank;

    public Employee() {

    }
}

如果您能提供有关如何解决此案的任何提示,我将不胜感激。看起来很常见的假设是 JPA 不可能做到这一点。

最佳答案

使用辅助表注释时引用员工 ID,并删除 rank_id。您是说数据通过使用该注释分布在多个表中,因此基本上两者的主键是相同的。实际上,由于两个 PK 具有相同的标识符,因此甚至不需要定义 @PrimaryKeyJoinColumn

请引用这里:https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/SecondaryTable.html

另一方面,如果您只想要多对一关系,则可以在 rank_id 中使用 @ManyToOne 注释和 @JoinColumn .

关于java - JPA 从多对一关系中获取值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31211471/

相关文章:

java - Swing 的骨架应用程序

java - 重写和重载之间的区别?

javassist.CannotCompileException : [source error] no such class: TestDebug

java - 未找到当前线程 : Spring 3 and Hibernate 4 (Using @PostConstruct annotation) 的 session

java - Struts 表单和变量声明

java - Hibernate 查询在论坛问题中搜索内容

java - 如何在 JPA/Hibernate 中设置具有通用 Id 的 MappedSuperClass

java - 使用 JPA Criteria API 生成正确和/或条件

java - Spring Boot 2.5.0、Spring Cloud 2020.0.2 和 Hibernate 5.4.31 - H2 数据库多行插入失败

java - JPA Eclipselink NamedQuery 与查询 COUNT