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

斯蒂芬·福克

我有两个实体Car,它CarDescription在哪里CarDescription取决于表中的另一个外键Language

我要完成的工作是拥有一个HashMapin,Car这样每当我有一个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;

    // ..
}

实体语言.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

如何完成正确的映射?

弗拉德·米哈西亚(Vlad Mihalcea)

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);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何获取 JPA 实体的子关联

如何在Java中将双打用作键

如何在Linq中将List <string>用作实体作为实体?

如何在Django多表继承中将现有的父级与子级关联

如何在JavaScript中将对象键用作标题和值子列表

如何在Mongo Map / Reduce Emit中将范围变量用作属性名称

如何在嵌套* ng中将父键传递给子级

如何从JPA的父实体记录中删除子对象?

如何在熊猫数据框中将子项与父项关联?

如何在地图中将结构用作键

如何在Java Maps中将Set用作键

如何在javascript中将父级的属性赋给子级?(OOP)

如何在JPA中将Enum用作NamedQuery参数

在Java中将子对象用作父对象属性是不好的做法吗?

如何在左联接中将子查询用作表

如何在Kotlin中将扩展属性用作常量?

如何在SQLAlchemy中将Dict [str,str]用作关系属性

如何在Laravel Eloquent中将变量用作属性名称

在Haxe中将对象用作Map键

如何在 JPA 实体中将字段设为可选?

如何在Rails中的对象上建立子关联而不保存父关联?

如何在Angular中将子FormGroup与父FormGroup结合

如果在SQLAlchemy中将“子”对象分配给“关系”,如何在“父”对象上设置属性?

在Swift中将受约束的关联类型的协议用作属性

如何在实体框架中将SQL查询结果用作对象?

如何在c ++中将父类用作继承的子类中的参数?

在JPA中更改子级后如何更新父级实体?

如何在 Flutter 中将 map 的键从 int 转换为 String

如何在父窗体中更改子窗体控件的属性