如何在JPA父实体中将子关联属性用作Map键

我有两个实体CarCarDescription ,其中CarDescription依赖于表Language另一个外键。

我想要实现的是在Car有一个HashMap ,这样每当我有一个Car实体对象时,我就可以从语言id访问所有描述。

实体Car.java

 @Entity @Table(name = "Car") public class Car extends AbstractTimestampEntity implements Serializable { private static final long serialVersionUID = -5041816842632017838L; @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name = "ID", unique = true, nullable = false) private Long id; @OneToMany(mappedBy="car") @MapKeyColumn(name = "language_ID") // @MapKey(name = "language") // does not work either private Map carDescription = new HashMap(0); } 

实体CarDescription.java

 @Entity @Table( name="car_description", uniqueConstraints = { @UniqueConstraint(columnNames={"language_id", "name"}) } ) public class CarDescription extends AbstractTimestampEntity implements Serializable { private static final long serialVersionUID = 2840651722666001938L; @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name = "ID", unique = true, nullable = false) private Long id; @NotNull @ManyToOne private Car car; @NotNull @OneToOne private Language language; // .. } 

实体Language.java

 @Entity public class Language implements Serializable { private static final long serialVersionUID = 3968717758435500381L; @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="ID") private Long id; // .. } 

我遇到的问题是映射为我提供了从CarDescription.idCarDescription

我怎样才能完成正确的映射?

CarDescription您需要添加languageId属性:

 @Column(name = "language_id", insertable = false, updatable = false) private Long languageId; @NotNull @OneToOne @JoinColumn(name = "language_id") private Language language; public void setLanguage(Language language) { this.languageId = language.getId(); this.language = language; } 

然后你可以在Car实体中使用它,如下所示:

 @OneToMany(mappedBy="car") @MapKey(name = "languageId") private Map carDescription = new HashMap<>(0);