[英]How to use a child association property as a Map key in JPA parent entity
我有兩個實體Car
和CarDescription
,其中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<Long, CarDescription> 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.id
到CarDescription
。
我怎樣才能完成正確的映射?
在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<Long, CarDescription> carDescription = new HashMap<>(0);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.