我试图在实体和名称/值对映射之间建立@OneToMany关系,其中地图查找不区分大小写。
我找到了可以解决部分问题的元素(String.CASE_INSENSITIVE_ORDER,@ StarComparator等),但是我很难以优雅的方式将它们整合在一起,所以任何帮助将不胜感激。
代码本身很简单
@Entity
public class Gizmo [
private String name;
private Map<String, GizmoData> data = new HashMap<String, GizmoData>();
public String getName() {
return name;
}
@OneToMany(cascade = { CascadeType.ALL }, orphanRemoval = true, mappedBy = "gizmo", fetch = FetchType.EAGER)
@MapKeyColumn(name = "name")
public Map<String, GizmoData> getData() {
return this.data;
}
@Transient
public String getDataValue(String key) {
GizmoData nvData = this.data.get(key);
return (nvData != null ? nvData.getValue() : null);
}
public void setDataValue(String key, String value) {
GizmoData nvData = new GizmoData(this, key, value);
this.data.put(key, nvData);
}
]
@Entity
public class GizmoData {
private Gizmo gizmo;
private String name;
private String value;
public GizmoData(Gizmo gizmo, String name, String value) {
this.gizmo = gizmo;
this.name = name;
this.value = value;
}
@ManyToOne
@JoinColumn(name = "gizmoId", nullable = false)
public Arrangement getGizmo() {
return gizmo;
}
public String getName() {
return name;
}
public String getValue() {
return value;
}
}
我可以明显地在瞬态方法中处理不区分大小写的东西,以确保在代码中插入的所有数据都被操作(toLower()或类似的东西)并且与检索相同。
问题是,还有另一个系统可以插入我无法控制的数据。如果那个系统插入一个NV对,比如camelCase,我的getter需要能够检索它。
一种解决方案是每次有人访问地图时都使用CASE_INSENSITIVE_ORDER比较器创建一个TreeMap,这让我觉得非常低效。
我考虑过并行维护一个有序的地图,使用@PrePersist和@PreUpdate这样的注释来同步Hibernate使用的地图,但至少可以说有点笨拙。
理想情况下,我希望Hibernate控制的一个地图被实例化为不区分大小写,但不知道如何做到这一点。有没有办法制作像这样的东西&#34;工作?
@OneToMany(cascade = { CascadeType.ALL }, orphanRemoval = true, mappedBy = "gizmo", fetch = FetchType.EAGER)
@MapKeyColumn(name = "name")
@SortComparator(value String.CASE_INSENSITIVE_ORDER)