¿Cómo asignar muchas colecciones de tipos de valor a una sola tabla en Hibernate?

Estoy tratando de asignar muchos conjuntos de tipos de valor en hibernación a una tabla por razones de rendimiento. Primero los puse a todos en su propia mesa, lo que condujo a demasiadas uniones.

Tengo una clase de Categorías que contiene muchos componentes con un conjunto de conjuntos y luego los mapeo a una sola tabla a través de subclases usando el nombre de entidad y el discriminador. Vea a continuación el fragmento de mapeo.

Esto funciona bien, pero debido a que la tabla única que contiene todos los conjuntos, es difícil eliminar automáticamente un conjunto cuando se elimina un componente. Esto se debe a que está modelado como una Entidad e Hibernate no puede indicar que el conjunto ha sido eliminado.

Detalles de mapeo:

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

Uso:

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.

Este error ocurre cuando los salarios del empleador no se eliminan automáticamente, ya que se marcan como secundarios de Categorías (ver la columna clave) y, por lo tanto, se eliminan como huérfanos cuando se eliminan las Categorías y no cuando se eliminan sus componentes ... Sin embargo, yo no puede convertir a EmployerWages en un hijo de Wage ya que Wage es un componente y las quejas de Hibernate entonces ...

Pffff ... muy difícil de resolver esto. Las ideas son más que bienvenidas ...

Respuestas a la pregunta(1)

Su respuesta a la pregunta