2

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

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

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

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

有什么方法可以让 Hibernate 为我做这件事吗?我愿意为空间的性能付出代价。

4

3 回答 3

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() {...}
}

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

于 2008-09-27T23:21:48.307 回答
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;
  }
}
于 2008-09-27T22:57:43.763 回答
0

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

于 2008-10-06T02:02:30.200 回答