由于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>
我目前正在使用带有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/我已经找到了。)
修改的 我不能减小所有属性的大小以适应大小限制。由外键组成的索引就足够了。 此外,我真的想要一个不会改变基础数据结构的解决方案,因为我正在使用已经在使用的产品。
答案 0 :(得分: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;
}
答案 1 :(得分:0)
这是我如何意识到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>
重要的部分是Parent子集定义的not-null="true"
标记内的key
。这使Subset可以保持对父级的无知。