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

时间:2008-09-27 22:47:47

标签: java mysql hibernate

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

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

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

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

有没有办法让Hibernate为我做这个?我愿意支付这个空间的性能。

3 个答案:

答案 0 :(得分:1)

根据sblundy的回答,你可能会得到类似的东西:

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

    public StringHolder getStringHolder() {...}
}

至少那时客户端代码不一定要知道这个改变。不过,我不知道是否值得这么麻烦。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我相信你想看看custom value types。 这应该允许您将字符串存储为数据库中的整数ID。当然,您必须自己提供映射/查找。