【问题标题】:Can I make Hibernate transparently avoid string duplication in the database?我可以让 Hibernate 透明地避免数据库中的字符串重复吗?
【发布时间】:2010-09-13 18:22:39
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java mysql hibernate


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      以 sblundy 的回答为基础,您可能会摆脱类似的情况:

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

      至少,客户端代码不必知道更改。不过,我不知道这是否值得。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 我想过,但有点希望有一种更优雅的方式,而不必在持久化它之前更改我在程序端访问 java 模型的方式......另外,会Hibernate 是否足够聪明,可以将其用作查找?我无法将字符串字段设为 ID 字段...
        • 没有。 Hibernate 通过 ID 跟踪事物,通常情况下,字符串不能以这种方式进行 ID。大多数人只是不需要像你一样关心空间。
        • 另外,引用表需要一个键来引用并且内存地址不可用,所以无论如何你都需要给它一个ID
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-01
        • 2012-02-01
        • 2022-07-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多