java - 如何减少 hibernate 集合的索引大小(使用复合元素设置)?

标签 java sql-server hibernate indexing xdoclet

由于 mssql 限制为 900 字节,我需要减少索引大小。

我有一个类,其中有一个声明为集合的集合。因此,主键由包括外键在内的所有非空列组成。索引是基于这个主键创建的。我不需要索引覆盖所有这些列。

有没有办法在不改变整个数据结构设置的情况下减少索引大小?

这是周围类定义中集合的当前配置:

  <set cascade="save-update,persist,merge,refresh,replicate,evict,delete,delete-orphan" fetch="select" lazy="true" table="mySubsetTable" batch-size="1000" name="attributes">
    <key foreign-key="FK_Mothertable">
      <column name="number"/>
      <column name="data"/>
    </key>
    <composite-element class="MySubsetElement">
      <property name="type" length="200" not-null="true" type="class"/>
      <property name="attribute" length="2000" column="attrValue" not-null="false"/>
      <property name="myboolean" type="boolean">
        <column name="myboolean"/>
      </property>
      <property name="anotherAttribute" length="200"/>
      <property name="evenAnotherAttribute" length="200" not-null="true"/>
      <property name="evenOneMoreAttribute" not-null="true">
        <type name="SomeClass">
          <param name="enumClass">someEnumClass</param>
        </type>
      </property>
    </composite-element>
  </set>

我目前正在使用带有 xdoclet 注释的 hibernate 3.3.1:

  /**
   * Attributes of this matchable
   * 
   * @hibernate.set table="mySubsetTable" cascade="save-update,persist,merge,refresh,replicate,evict,delete,delete-orphan" lazy="true"
   *                batch-size="1000" fetch="select"
   * @hibernate.key foreign-key="FK_Mothertable"
   * @hibernate.key-column name="number"
   * @hibernate.key-column name="data"
   * @hibernate.composite-element class="MySubsetElement"
   */
   public Set<MySubsetElement> getSubsetElements() { ... }

非常感谢您的建议!

(请不要让我引用 http://docs.jboss.org/hibernate/ 我已经找到了。)

编辑 我无法减小所有属性的大小以适应大小限制。由外键组成的索引就足够了。 另外,我真的很想要一个不会改变底层数据结构的解决方案,因为我正在开发一个已经在使用的产品。

最佳答案

您正在使用 composite elements为你的集合。这可能真的是“正确”的方式,因为所有 MySubsetElement 都依赖于它们的所有者,但它也对关系模型有影响,正如您现在看到的那样。

我建议采用类似以下的方法(我正在使用注释,您可能希望将其转换为您的映射配置):

@Entity
class MySubsetElement {

  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  private Long id;

  @ManyToOne(optional=false)
  private MyParentElement owner;

  public MySubsetElement( MyParentElement owner ) {
    ...
  }

}

@Entity
public class MyParentElement {

  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  private Long id;

  @OneToMany(mappedBy="owner", cascade={CascadeType.ALL})
  private Set<MySubsetElement> children;

}

关于java - 如何减少 hibernate 集合的索引大小(使用复合元素设置)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37071396/

相关文章:

java - 如何在Java中实现搜索 token (如mac Lion中)?

sql - 提高 SQL CTE 查询性能

java - Hibernate 延迟加载单列

mysql - Hibernate - 在表的所有列中搜索文本

java - 为什么我总是在 View.OnClickListener 中看到最后一个 id?

java - 如何使用工作后退按钮创建 Android 文件列表?

java - 如何让 SimpleComboBox 显示我的默认值

c# - 存储过程未在表中插入值

c# - 获取表的列名并将它们存储在字符串或 var c# asp.net 中

java - 用于学习的示例 Hibernate 应用程序