如何在Hibernate中将多个值类型集合映射到一个表?

如何在Hibernate中将多个值类型集合映射到一个表?,hibernate,hibernate-mapping,Hibernate,Hibernate Mapping,出于性能原因,我尝试将hibernate中的许多值类型集映射到一个表。 首先,我把它们都放在自己的表中,这导致了太多的连接 我有一个Categories类,它包含许多组件和一组集合,然后我使用实体名和鉴别器通过子类将它们映射到一个表中。 请参见下面的映射片段 这样做很好,但由于单个表包含所有集合,因此在移除组件时很难自动移除集合。这是因为它被建模为一个实体,而Hibernate不能发出该集合已被删除的信号 映射详细信息: <class name="com.sample.Categories

出于性能原因,我尝试将hibernate中的许多值类型集映射到一个表。 首先,我把它们都放在自己的表中,这导致了太多的连接

我有一个Categories类,它包含许多组件和一组集合,然后我使用实体名和鉴别器通过子类将它们映射到一个表中。 请参见下面的映射片段

这样做很好,但由于单个表包含所有集合,因此在移除组件时很难自动移除集合。这是因为它被建模为一个实体,而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>

...
...
...
用法:

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.
Categories猫=新分类默认值();
工资=新工资();
Set=newhashset();
set.add(newemployerwagedefault(cats));
工资。设定员工年龄(套);
IncomMemberInc=新的IncomMemberDefault();
公司设定工资(工资);
cats.SetIncomember(公司);
cats.saveOrUpdate();//将其存储在数据库中。
//现在除去收入:
cats.setIncomMember(空);
cats.saveOrUpdate();
cats=getPersister().findCats(cats.getId());
//错误:猫仍然包含收入、工资和雇员工资。
发生此错误的原因是,EmployerWorks不会自动删除,因为它们被标记为类别的子类别(请参见“关键”列),因此,当类别被删除时,它们会被删除为孤立类别,而不是当其组件被删除时。。。 然而,我不能让雇员成为工资的孩子,因为工资是一个组成部分,然后让抱怨冬眠


Pffff。。。很难解决这个问题。想法更受欢迎…

不确定这是否有帮助,但您是否尝试过使用鉴别器列来告诉Hibernate 根据表中的不同标准加载哪种值类型


不确定这是否有用,但您是否尝试过使用鉴别器列来告诉Hibernate 根据表中的不同标准加载哪种值类型


我看不出这与这个问题有什么关系?老实说,这是很久以前的事了,我不记得我最初的想法了。但我现在没有足够的时间来回顾和改进答案。我不知道这与这个问题有什么关系?说实话,这是很久以前的事了,我不记得我最初的想法。但是我现在没有足够的时间来复习和改进答案。