hibernate две таблицы на один объект

у меня одна сущность -User. Это описано User.class.

Hibernate создает одну таблицу на объект, поэтому, когда я вызываю session.save(user) мои данные всегда сохраняются в этой таблице.

теперь мне нужна другая таблица для данных того же User введите, и мне нужно сохранить мою сущность только в этой таблице.

структуры данных (что-то вроде этого):

table users_1_table{
  string id;
  string username;
}

table users_2_table{
  string id;
  string username;
}

работы с этим:

session.save(user1,"users_1_table")
session.save(user2,"users_2_table")

и в результат я должен был user1 на users_1_table и user2 на users_2_table.

из-за ограничения системы я не могу поместить эти два объекта в одну таблицу. (Даже создание дополнительного поля-плохая идея).

могу ли я сделать это без подклассов? Используя конфигурацию гибернации programmaticaly?

4 ответов


предисловие:

это широко задаваемый вопрос даже на SO, а также широко ответы связаны с Subclass или на самом деле SuperClass подхода (например, [1])

правильный ответ:

на эти должности [2], [3] они предлагают использовать сопоставление xml с


также он работает с использованием сущности по умолчанию и альтернативной:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
   <class name="DomainModel.User, DomainModel"
     table="User1Object">  
         <id name="_id" access="field" column="id">
             <generator class="assigned"/>
         </id>
        <property name= ...>
 </class>
 <class name="DomainModel.User, DomainModel"
     table="User2Object" entity-name="User2Object">
         <id name="_id" access="field" column="id">
            <generator class="assigned"/>
         </id>
        <property name= ...>
</class>
</hibernate-mapping>

используемое по умолчанию, вы можете использовать метод

_session.Save(user1)

и

_session.Save("User2Object", user2)

для альтернативной.


вы можете сделать это через настройки:

  • создайте два сопоставления для одного класса сущности name, но дайте им разные логические entity-name и стол имя.
  • затем использовать Session методы, где вы укажите entityName в качестве параметра для отличия одного от другого.

что это достичь?

  • "виртуальный подтипов"
  • при получении данных в тип необходимо указать один entity-type или другой (таким образом, подразумевая одну таблицу или другую)
  • когда вы изменяете данные и сохраняете их, вы должны указать то же самое entity-type - попытка обновления с помощью другого entity-type должен быть отклонен hibernate. В противном случае измененные сущности уже будут иметь заполненный идентификатор, поэтому hibernate попытается обновить, а не вставить, но это не удастся в базе данных - попытка обновить данные, которые никогда не существовали в таблице.
  • это приводит к сегрегации - при работе с сущностью или списком сущностей вы должны зафиксировать один тип сущности и не можете смешивать их. т. е. "виртуальный подтип"

какова стоимость?

  • это дает очень слабый набор текста. Компилятор и среда выполнения не имеют указания на true подтип. Ошибки ждут, чтобы произойти, и может быть сложно отладить.
  • это нестандартным. JPA избегает этого, я считаю, что это не на радаре для включения, и по уважительной причине.
  • вы должны использовать XML, а не аннотации.
  • необходимо вызвать необычные методы, включая параметр "entity-type".

есть ли преимущества над подтипом?

  • нет, что я могу см.

стоит ли?

  • я так не думаю! Используйте подтипирование и стандартный код.

хотя я никогда не использовал, но есть концепция вторичной таблицы в спящем режиме. И @SecondaryTables-это аннотация в hibernate, с помощью которой объект может сопоставить несколько таблиц для извлечения данных. Организация выборки данных должен иметь @SecondaryTables аннотации. Он связывает вторичную таблицу на основе первичного и внешнего ключей, а также на основе уникальных ограничений.

вот один образец, который я нашел после выполнения google, проверьте, помогает ли он вам достичь:

http://www.concretepage.com/hibernate/secondarytables_hibernate_annotation.php