我有一个Java程序,它使用Hibernate和MySQL存储大量有关Eclipse IDE使用的跟踪数据。此数据包含许多字符串,例如方法名称,目录,透视图名称等。
例如,事件对象(然后在记录中反映)可以指定源文件和当前方法,用户名等。显然,字符串数据可以重复。
只要它在内存中,其中大部分是内化的,所以所有重复的字符串实例都指向同一个对象(我确保这一点)。但是,使用@Basic(我使用注释),Hibernate将它映射到VARCHAR(255),这意味着浪费了很多空间。
如果我自己编写SQL,我可以将VARCHAR替换为手动管理的字符串查找表的索引并保存空间(以额外查找为代价)。
有没有办法让Hibernate为我做这个?我愿意支付这个空间的性能。
答案 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。当然,您必须自己提供映射/查找。