我在 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/