Честно говоря, это было так давно, я не помню свое первоначальное мышление об этом. У меня действительно нет достаточно времени, чтобы рассмотреть это и улучшить ответ прямо сейчас.

аюсь сопоставить множество наборов типов значений в спящем режиме с одной таблицей по соображениям производительности. Сначала я поместил их все в их собственную таблицу, что привело к слишком большому количеству объединений.

У меня есть класс Categories, который содержит много компонентов со множеством наборов, а затем я сопоставляю их с одной таблицей через подклассы, используя имя-сущность и дискриминатор. Ниже приведен фрагмент кода.

Это прекрасно работает, но поскольку одна таблица содержит все наборы, трудно автоматически удалить набор при удалении компонента. Это потому, что он смоделирован как Entity, и 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.

Эта ошибка возникает из-за того, что EmployerWages не удаляются автоматически, поскольку они помечаются как дочерние категории (см. Ключевой столбец), и поэтому они удаляются как сиротские при удалении категорий, а не при удалении его компонентов ... Однако я не может сделать EmployerWages дочерним элементом Wage, так как Wage является компонентом, и жалобы Hibernate тогда ...

Пфффф ... очень трудно решить это. Идеи более чем приветствуются ...

Ответы на вопрос(1)

поможет ли это, но пытались ли вы использовать столбец дискриминатора, чтобы сообщить Hibernate, какой тип значения загружать на основе различных критериев в таблице?

http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/mapping.html#mapping-declaration-discriminator

 Jason Lowenthal09 июл. 2014 г., 16:20
Честно говоря, это было так давно, я не помню свое первоначальное мышление об этом. У меня действительно нет достаточно времени, чтобы рассмотреть это и улучшить ответ прямо сейчас.
 edbras09 июл. 2014 г., 15:46
Не понимаю, насколько это актуально для вопроса?

Ваш ответ на вопрос