JPA / Hibernate中不区分大小写的名称/值映射

时间:2016-10-05 08:05:42

标签: java hibernate jpa

我试图在实体和名称/值对映射之间建立@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)

0 个答案:

没有答案