2016-05-06 5 views
2

mssqlの制限が900バイトであるため、インデックスサイズを小さくする必要があります。hibernateコレクションのインデックスサイズを減らすにはどうすればいいですか(composite-elementで設定)?

私は、セットとして宣言されたコレクションを持つクラスを持っています。このため、主キーは外部キーを含むすべての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> 

私は現在、XDocletの注釈と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/に私を参照しないでください。)

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

+0

あなたは '複合要素 'を使用しています。それは必要ですか? 「MySubsetElement」の「ファーストクラスの市民」エンティティを作成し、通常のOneToMany関係を使用するのはどうですか? – JimmyB

+0

私はここで巨大な構造を持っていて、いつか私の前に来た誰かがそれをそのように定義しました...これとは別のやり方があるなら、私はここにそれを入れて、私の場合に適用できるならば後で評価します。あなたの提案をありがとう! –

+0

これは、「MySubset」をエンティティとして構成し、セット内に一対多の関係を作成するということですか? –

答えて

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親サブセット定義のタグ。これにより、サブセットは親を知らないままになります。

1

あなたのセットには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; 

} 
+0

問題は、サブセットがそれを作成するときに親を知る必要があるということです。しかし、あなたの答えは正しい方向で私を指摘し、私は[jbossのドキュメント](http://docs.jboss.org/hibernate/orm/3.5/reference/en/html/collections.html#collections-indexed "私が試してみる一方向のマッピングについては、「コレクションの索引付け」を参照してください。ありがとう –

+0

"ここに問題は..." - なぜそれが問題になるのでしょうか?親はそのサブセットの前に存在しなければならず、そのサブセットを親に置くためには、親も手元になければならない。通常は問題ありません。 – JimmyB

+0

こんにちは、私はそれを実現するために、非NULL制約をセットに追加しました。それは今働く。私はまだ100%満足していません。なぜなら、サブセットテーブルには追加の列がありますが、それは人生です。再度、感謝します。 –

関連する問題