Como mapear muitas coleções de tipos de valor para uma única tabela no Hibernate?

Estou tentando mapear muitos conjuntos de tipos de valor em hibernação para uma tabela por motivos de desempenho. Primeiro, coloquei todos eles em sua própria mesa, o que levou a muitas junções.

Eu tenho uma classe Categorias que contém muitos componentes com vários conjuntos e, em seguida, mapeio-os para uma única tabela através de subclasses usando o nome da entidade e o discriminador. Veja abaixo o snippet de mapeamento.

Isso funciona bem, mas como a tabela única que contém todos os conjuntos, é difícil remover automaticamente um conjunto quando um componente é removido. Isso ocorre porque ele é modelado como uma Entidade e o Hibernate não pode sinalizar que o conjunto foi removido.

Detalhes do mapeamento:

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

Esses erros ocorrem porque os EmployerWages não são removidos automaticamente, pois são marcados como filhos de Categorias (consulte a coluna-chave) e, portanto, são removidos como órfãos quando Categorias são removidas e não quando seus componentes são removidos ... No entanto, eu não pode fazer do EmployerWages um filho do salário, pois o salário é um componente e as queixas do Hibernate ...

Pffff ... muito difícil resolver isso. Idéias são mais do que bem-vindas ...

questionAnswers(1)

yourAnswerToTheQuestion