出于性能原因,我试图将休眠中的许多值类型集映射到一张表。
首先,我确实将它们全部放在自己的表中,这导致了太多的连接。
我有一个类别类,其中包含许多带有一组集合的组件,然后我使用实体名称和鉴别器通过子类将它们映射到单个表。
请参阅下面的映射片段。
这工作正常,但由于包含所有集合的单个表,因此在删除组件时很难自动删除集合。这是因为它被建模为实体,并且 Hibernate 无法发出该集已被删除的信号。
映射详细信息:
<class name="com.sample.CategoriesDefault" table="dec_cats" >
<id name="id" column="id" type="string" length="40" access="property">
<generator class="assigned" />
</id>
<component name="incomeInfoMember" class="com.sample.IncomeInfoDefault">
<property name="hasWage" type="boolean" column="inMemWage"/>
...
<component name="wage" class="com.sample.impl.WageDefault">
<property name="hasEmployerWage" type="boolean" column="inMemEmpWage"/>
...
<set name="employerWages" cascade="all-delete-orphan" lazy="false">
<key column="idCats" not-null="true" />
<one-to-many entity-name="mIWaEmp"/>
</set>
</component>
</component>
</class>
<class name="com.sample.NameValueTypeEntityMarker" table="cats_name_amount">
<id name="id" column="id" type="string" length="40" access="property">
<generator class="assigned" />
</id>
<discriminator type="string" force="true">
<column name="objType" index="ixDiscrCatsNameAmt" length="25" not-null="true" />
</discriminator>
<version name="version" column="objVrs" unsaved-value="negative"/>
<property name="name" type="string" column="name" not-null="true" />
<subclass name="com.sample.NameAmountsIntValueTypeEntityMarker">
<property name="amount1" type="integer" column="amount1" access="property" not-null="true"/>
...
<subclass entity-name="mIWaEmp" name="com.sample.EmployerWageDefault" discriminator-value="mIWaEmp" />
<subclass entity-name="pIWaEmp" name="com.sample.impl.EmployerWageDefault" discriminator-value="pIWaEmp" />
</subclass>
</class>
Usage:
Categories cats = new CategoriesDefault();
Wage wage = new Wage();
Set<EmployerWage> set = new HashSet<EmployerWage>();
set.add(new EmployerWageDefault(cats));
wage.setEmployerWages(set);
IncomeMember inc = new IncomeMemberDefault();
inc.setWage(wage);
cats.setIncomeMember(inc);
cats.saveOrUpdate(); // will store it in the db.
// now remove the income:
cats.setIncomeMember(null);
cats.saveOrUpdate();
cats = getPersister().findCats(cats.getId());
// ERROR: cats still contains IncomeMember, Wage and EmployerWages.
发生此错误的原因是 EmployerWages 不会自动删除,因为它们被标记为类别的子级(请参阅关键列),因此当类别被删除时,它们会作为孤儿被删除,而不是在其组件被删除时...
但是,我不能让 EmployerWages 成为 Wage 的子项,因为 Wage 是一个组件,然后 Hibernate 会抱怨......
噗……这个问题很难解决。想法更受欢迎......
不确定这是否有帮助,但是您是否尝试过使用鉴别器列来告诉 Hibernate
根据表中的不同标准加载哪种值类型?
http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/mapping.html#mapping-declaration-discriminator
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)