问题描述
这是我第一次用 Maps 做 JPA 的持久化。 我也在概念层面上迷失了自己。
我有一个对象 (poi),它没有一个或多个不同语言的描述。 我希望 poi 对象有一个地图 [lang,description]
@Entity
public class Poi {
@Id
@Column(name = "id")
private Long id;
@OnetoMany(cascade = CascadeType.ALL)
@JoinTable(name = "description_poi_mapping",joinColumns = {@JoinColumn(name = "poi_id",referencedColumnName = "id")},inverseJoinColumns = {@JoinColumn(name = "description_id",referencedColumnName = "id")})
@MapKeyJoinColumn(name = "lang_id")
@MapKey
private Map<Lang,Description> descriptionCourte;
说明:
@Entity
public class Description {
@Id
@Column(name = "id")
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String label;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "lang_id")
private Lang lang;
朗:
@Entity
public class Lang {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
@Column(name = "id")
private Long id;
@Column(name = "label")
private String label;
因此,描述包含附加到语言的标签(fr、en、it、de、...) 我希望我能做到,在地图上;
> poi.getDescriptionCourte().get("en") or
> poi.getDescriptionCourte().get("fr")
基本上,地图的键是语言标签(如果存在)。如果“poi”有1个英文描述和1个法语描述,那么我的地图必须有2个记录,其键值为“fr”或“en”(为“lang”记录的标签)
当然,目标是能够将 lang 类重用于其他描述。
排除我当前的结果根本不是我想要的,这里是:
你能帮我吗?
谢谢。
解决方法
这不是直接可能的。您可以实现 equals
的 hashCode
/Lang
以便仅使用标签,然后您可以访问 poi.getDescriptionCourte().get(new Lang("fr"))
之类的元素或将其抽象为单独的方法 {{1}这做我之前写的。请注意,这需要您获取所有 Lang 对象,即在当前会话/entityManager 中有它们的托管表示,因此我建议您使用 poi.getDescriptionCourte("fr")
代替它由 Hibernate 映射到仅包含本地代码。您还可以将 Locale
建模为 Lang
或提供在 @Embeddable
和 AttributeConverter
之间转换的 String
。这样,就不需要额外的连接/获取。