如何使用子关联 属性 作为 JPA 父实体中的映射键
How to use a child association property as a Map key in JPA parent entity
我有两个实体 Car
和 CarDescription
,其中 CarDescription
取决于 table Language
.[=23 中的另一个外键=]
我想要完成的是在 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);
我有两个实体 Car
和 CarDescription
,其中 CarDescription
取决于 table Language
.[=23 中的另一个外键=]
我想要完成的是在 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);