2008-09-27 38 views
2

我有一个Java程序,它使用Hibernate和MySQL来存储大量关于使用Eclipse IDE的跟踪数据。这些数据包含很多字符串,例如方法名称,目录,透视图名称等。我可以让Hibernate透明地避免数据库中的字符串重复吗?

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

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

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

有没有办法让Hibernate为我做这件事?我愿意支付这个空间的表现。

回答

0

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

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

    public StringHolder getStringHolder() {...} 
} 

至少这样的客户端代码不一定必须意识到变化:

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

我想过,但有点希望有一个更优雅的方式,而不必改变我在程序端访问Java模型的方式,然后再坚持下去...... 另外,Hibernate会变得聪明足以使用这是作为一个查找?我不能让字符串字段的ID字段... – Uri 2008-09-27 23:06:44

1

上sblundy的回答大厦,你很可能喜欢的东西离开。不过,我不知道这是否值得麻烦。

0

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

相关问题