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



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

我有一个类,它有一个声明为集合的集合。因此,主键由包括外键在内的所有notnull列组成。将从此主键创建索引。我不需要索引覆盖所有这些列。

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

以下是当前配置的集合内部的周围类定义:

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

我目前正在使用hibernate 3.3.1和xdoclet注释:

  /**
   * 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/我已经找到了。)

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

您正在为集合使用复合元素。这可能真的是"正确"的方式,因为所有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;
}

以下是我如何实现Jimmy的建议:

<hibernate-mapping>
    <class name="MyParent" ....>
      ...
      <set cascade="save-update,persist,merge,refresh,replicate,evict,delete,delete-orphan" fetch="select" lazy="true" table="SubsetTable" batch-size="1000" name="attributes">
        <key foreign-key="FK_ParentTable" not-null="true">
          <column name="number"/>
          <column name="data"/>
        </key>
        <one-to-many class="MySubset" entity-name="MySubsetentity"/>
      </set>
      ...
    </class>
    <class name="MySubset" ....>
          <id name="id" type="long">
            <column name="id"/>
            <generator class="MyIdGeneratorClass">
              <param name="sequence">mySequence</param>
            </generator>
          </id>
          <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>   
    </class>
</hibernate-mapping>

重要的部分是父子集定义的key标记中的not-null="true"。这使得子集能够保持对父对象的无知。

相关内容

  • 没有找到相关文章

最新更新