2016-05-06 3 views
2

Ich muss Indexgrößen wegen mssql Limit von 900 Bytes reduzieren.Wie kann ich die Indexgröße einer Hibernate-Sammlung reduzieren (gesetzt mit Composite-Element)?

Ich habe eine Klasse, die eine Sammlung als Satz deklariert hat. Aus diesem Grund besteht der Primärschlüssel aus allen Nicht-Null-Spalten einschließlich des Fremdschlüssels. Aus diesem Primärschlüssel wird ein Index erstellt. Ich brauche den Index nicht über all diese Spalten.

Gibt es eine Möglichkeit, die Indexgröße zu reduzieren, ohne das gesamte Setup der Datenstruktur zu ändern?

Hier ist die aktuelle Konfiguration der Sammlung innerhalb der umgebenden Klassendefinition:

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

ich derzeit 3.3.1 mit xdoclet Anmerkungen bin mit Hibernate: viel

/** 
    * 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() { ... } 

Dank für Ihre

Vorschläge!

(Und bitte beziehen Sie mich nicht zu http://docs.jboss.org/hibernate/ fand ich schon.)

EDIT ich nicht die Größe aller Eigenschaften reduzieren können die Größenbeschränkungen passen. Ein aus den Fremdschlüsseln bestehender Index würde genügen. Auch ich würde wirklich gerne eine Lösung, die die zugrunde liegende Datenstruktur nicht ändert, da ich an einem Produkt arbeite, das bereits verwendet wird.

+0

Sie verwenden 'zusammengesetzte Elemente'. Ist das erforderlich? Warum nicht "First Citizen" -Entitäten von "MySubsetElement" erstellen und eine normale "OneToMany" -Beziehung verwenden? – JimmyB

+0

Ich habe hier eine riesige Struktur und jemand, der vor mir kam, hat es irgendwann so definiert ... Wenn es eine Möglichkeit gibt, dies anders zu machen, möchte ich es hier sehen und später auswerten, wenn es auf meinen Fall angewendet werden kann. Vielen Dank für Ihre Vorschläge! –

+0

Würde dies bedeuten, "MySubset" als eine Einheit zu konfigurieren und eine Eins-zu-viele-Beziehung in der Menge zu machen? –

Antwort

0

hier ist, wie ich erkannte, Jimmys Vorschlag:

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

der wichtige Teil ist die not-null="true" innerhalb der key Tag der Elternteilmengen-Definition. Dies ermöglicht dem Subset, den Elter nicht zu kennen.

1

Sie verwenden composite elements für Ihr Set. Dies kann wirklich der "richtige" Weg sein, weil alle MySubsetElement s von ihrem Besitzer abhängen, aber es hat auch Auswirkungen auf das relationale Modell, wie Sie es gerade erleben.

ich so etwas wie die folgenden Ansatz würde vorschlagen (I Anmerkungen bin mit, möchten Sie vielleicht, dass auf Ihre Mapping-Konfiguration übersetzen):

@Entity 
class MySubsetElement { 

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

    @ManyToOne(optional=false) 
    private MyParentElement owner; 

    public MySubsetElement(MyParentElement owner) { 
    ... 
    } 

} 

und

@Entity 
public class MyParentElement { 

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

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

} 
+0

Hier ist das Problem, dass das Subset die Eltern kennen muss, wenn ich es erstelle, denke ich. Aber deine Antwort hat mich in die richtige Richtung gelenkt und ich habe etwas in der [jboss-Dokumentation] gefunden (http://docs.jboss.org/hibernate/orm/3.5/reference/en/html/collections.html#collections-indexed " Collections-indiziert ") über unidirektionale Mappings, die ich ausprobieren werde. Danke –

+0

"Hier ist das Problem ..." - Warum sollte das ein Problem sein?Der Elternteil muss vor der Teilmenge existieren, und um die Teilmenge in den Elternteil zu legen, muss der Elternteil auch zur Hand sein. Normalerweise kein Problem. – JimmyB

+0

Hi, ich habe es realisiert, indem ich eine Nicht-Null-Einschränkung für die Menge hinzugefügt habe. Es funktioniert jetzt. Ich bin immer noch nicht 100% glücklich, weil die Teilmenge-Tabelle jetzt eine zusätzliche Spalte hat, aber das ist das Leben. Danke noch einmal. –

Verwandte Themen