JPA OneToMany 关系映射:外键作为复合主键一部分的解决方案

本文旨在解决JPA中OneToMany关系映射的常见难题:当“多”方实体(如Translation)的外键(TRANSLATION_DV_ID)同时是其复合主键的一部分时,JPA默认映射可能无法正确识别关联,导致获取到的列表为空。核心解决方案是在OneToMany注解中,通过@JoinColumn的referencedColumnName属性显式指定关联列,以指导JPA正确建立实体间的连接。

问题背景与挑战

在jpa实体关系映射中,onetomany是一种常见的关联类型。然而,当“多”方实体(例如translation)的外键(foreign key, fk)不仅是普通列,而且还是其复合主键(composite primary key, pk)的一部分时,jpa的默认映射机制可

能会遇到困难。这种情况下,即使数据库中的数据是正确的,jpa在加载“一”方实体(例如service)时,其关联的“多”方实体列表(list)却可能为空。

让我们通过一个具体的例子来阐述这个问题。假设我们有两个实体:Service和Translation。一个Service可以有多个Translation,因此它们之间是OneToMany关系。Translation实体具有一个复合主键,由TRANSLATION_DV_ID和LOCALE_CD组成,其中TRANSLATION_DV_ID同时作为外键关联到Service实体。

初始的实体定义(可能导致问题)

首先是Service实体的一部分代码:

import javax.persistence.*;
import java.util.