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 ответов
также он работает с использованием сущности по умолчанию и альтернативной:
<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