2

mssql の制限が 900 バイトであるため、インデックスのサイズを減らす必要があります。

セットとして宣言されたコレクションを持つクラスがあります。このため、主キーは、外部キーを含むすべての非 null 列で構成されます。この主キーから索引が作成されます。これらすべての列にインデックスを付ける必要はありません。

データ構造の設定全体を変更せずにインデックス サイズを縮小する方法はありますか?

周囲のクラス定義内のコレクションの現在の構成は次のとおりです。

  <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/を私に紹介しないでください 。私はすでにこれを見つけました。)

編集 サイズ制限に合わせてすべてのプロパティのサイズを縮小することはできません。外部キーで構成されるインデックスで十分です。また、すでに使用されている製品に取り組んでいるため、基礎となるデータ構造を変更しないソリューションが本当に必要です。

4

2 に答える 2

1

セットに複合要素を使用しています。すべての s はその所有者に依存するため、これは本当に「正しい」方法かもしれませんが、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;

}
于 2016-05-06T11:52:46.917 に答える
0

ジミーの提案を実現した方法は次のとおりです。

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

重要な部分は、親サブセット定義not-null="true"のタグ内です。keyこれにより、サブセットは親を認識しないままになります。

于 2016-05-11T13:51:13.393 に答える