我可以透明地使Hibernate避免数据库中的字符串重复吗?

时间:2020-03-06 14:50:01  来源:igfitidea点击:

我有一个Java程序,该程序使用Hibernate和MySQL存储有关Eclipse IDE使用的大量跟踪数据。该数据包含许多字符串,例如方法名称,目录,透视图名称等。

例如,事件对象(然后反映在记录中)可以指定源文件和当前方法,用户名等。显然,字符串数据可以重复自身。

只要它在内存中,大部分都会被内部化,因此所有重复的字符串实例都指向同一个对象(我确保做到这一点)。但是,使用@Basic(我使用批注),Hibernate将其映射到VARCHAR(255)中,这意味着浪费了很多空间。

如果我自己编写SQL,则可以用对手动管理的字符串查找表的索引替换VARCHAR,并节省空间(以额外的查找为代价)。

有什么办法让Hibernate为我做到这一点?我愿意为此付出性能上的损失。

解决方案

我怀疑我们将需要一个字符串持有者对象,然后确保所有这些对象都引用了该对象。

class StringHolder {
  private Long id;
  private String string;

  public StringHolder() {/* Not sure if this is necessary */}

  public StringHolder(String string) {
    this.string = string;
  }

  public void getString() {
    return this.string;
  }
}

基于sblundy的答案,我们可能会摆脱类似这样的情况:

class Foo {
    // client code uses this to get the value... ignored by Hibernate
    @Transient
    public String getString() {
        return getStringHolder().getString();
    }

    public StringHolder getStringHolder() {...}
}

至少客户端代码不必一定要知道更改。我不知道这是否值得麻烦。

我相信我们想看看自定义值类型。
这应该允许我们将字符串作为整数ID存储在数据库中。当然,我们将必须自己提供映射/查找。