本文介绍了如何在 JPA 父实体中使用子关联属性作为 Map 键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个实体 CarCarDescription 其中 CarDescription 依赖于表 Language.

I'm having two entities Car and CarDescription where CarDescription is depending on another foreign key from the table Language.

我想要完成的是在 Car 中有一个 HashMap 这样每当我有一个 Car 实体对象我能够从语言 ID 访问所有描述.

What I' trying to accomplish is to have a HashMap in Car such that whenever I'm having a Car entity-object I am able to access all descriptions from the language 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.idCarDescription 的地图.

The problem I am having is that the mapping gives me a map from each CarDescription.id to CarDescription.

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

How can I accomplish a correct mapping?

推荐答案

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 实体中使用它:

Then you can use it in the Car entity like this:

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

这篇关于如何在 JPA 父实体中使用子关联属性作为 Map 键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

05-18 22:38