2016-09-26 3 views
0
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 

В родительском классе можно обрабатывать дочерние сущности в виде таблиц с той же информацией, что и родительский плюс некоторые атрибуты. Это прекрасно для меня, когда читаю (http://viralpatel.net/blogs/hibernate-inheritance-table-per-concrete-class-annotation-xml-mapping/).Стратегия для записи в родительский объект, а также при хранении дочерних объектов по схеме JPA с помощью стратегии наследования TABLE_PER_CLASS

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

Возможно ли настроить или выполнить явное выполнение childRepo.save(child) плюс parentRepo.save(child) в транзакции при любой заданной операции записи?

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

+0

Что такое 'childRepo'? – chrylis

+0

Что такое «репозиторий»? Если вы имеете в виду репозиторий Spring Data, это важный компонент, который вам необходимо включить в свой вопрос. И вы никогда не должны бросать подкласс в свой суперкласс, чтобы передать его методу, принимающему суперкласс. – chrylis

+0

1.Да, извините, репортаж JPA Spring Data. 2. Вот почему я ненавижу этот обходной путь, и я пытаюсь исправить более аккуратное решение. – Whimusical

ответ

0

Существует 3 стратегии наследования: SINGLE_TABLE, JOINED и TABLE_PER_CLASS. -TABLE_PER_CLASS: сопоставляет каждую сущность с таблицей -SINGLE_TABLE: родительский объект и дети будут отображаться только в одну таблицу (в БД вы получаете только одну таблицу для всей иерархии наследования). -JOINED: это вам нужно, общие атрибуты будут сохранены в родительской таблице, и ребенок относительные атрибуты будут сохранены в дочерней таблице

+0

Таковы стратегии, определенные JPA, для любого другого необходимого поведения, которое вам нужно реализовать для себя, вы можете использовать SINGLE_Table + parentRepo.save ((родительский) дочерний элемент) – Elgayed

+0

В JOINED отсутствует одна из моих потребностей, которая хранит унаследованные атрибуты дочернего объекта на детском столе – Whimusical

+1

Я имел в виду, что это ближайший к вашим потребностям, если вы хотите придерживаться определенных стратегий JPA, иными словами, вам нужно добавить имплантацию, чтобы удовлетворить ваши потребности. решение, о котором вы упомянули, в порядке, вы также можете использовать триггер DB или прослушиватели JPA (слушатель при создании дочернего объекта, который будет выполнять сохранение в родительском объекте) – Elgayed

0

Добавление в 3 наследования стратегий: SINGLE_TABLE, TABLE_PER_CLASS и JOINED , Говоря о вставке, table_per_class имеет отдельные запросы на вставку в одной таблице, но различное значение дискриминатора. Таблица также будет иметь нули для каждого альтернативного столбца, для которого установлен дискриминатор. Выбор также будет отдельным. Если используется вспомогательный класс union, то один запрос select с объединением. В объединенной стратегии две вставки для родительской и дочерней таблиц. Выбор выполняется с помощью родительского стола, оставленного внешним соединением с дочерней таблицей.

Итак, если вы хотите использовать table_per_class, вы можете использовать объединение для каждого подкласса с классом-генератором в качестве назначенного и значение полиморфизма как неявное или объединенное подклассом.

Смежные вопросы