Как сопоставить один класс с разными таблицами, используя аннотации hibernate/jpa
В настоящее время я застрял в том, что кажется очень простой проблемой, но я просто не могу найти способ:
У меня есть 2 идентичные таблицы:
- tbl_creditcard_approved_txns
- tbl_creditcard_declined_txns
Поля в обоих одинаковы, и у меня есть один класс - Transaction
, который используется для представления всех соответствующих полей в таблицах.
Я пытаюсь сопоставить два разных объекта (по одному для каждой таблицы) с указанным выше классом. В старом мире я бы создал два файла hbm.xml
, по одному для каждой таблицы, и сопоставил их оба с Transaction
. Затем я использовал имя сущности во время персистентности, чтобы гарантировать сохранение объекта в правильной таблице в зависимости от обстоятельств.
Я пытаюсь использовать аннотации в настоящее время для достижения того же, но пока не повезло в сопоставлении двух объектов с классом single. Это вообще возможно?
В настоящее время я использую другой подход, поскольку я извлек все общие поля (идентичные имена столбцов) в @MappedSuperClass
и создал два отдельных класса (по одному для каждого объекта), которые простираются от суперкласса ( эти классы имеют только те же поля с разными именами столбцов, где это применимо).
Ответы
Ответ 1
Используя @MappedSuperclass, вы будете действовать следующим образом:
@MappedSuperclass
public class Transaction ...
@Entity
@Table(name="tbl_creditcard_approved_txns")
public class DeclinedTransaction extends Transaction ...
@Entity
@Table(name="tbl_creditcard_declined_txns")
public class ApprovedTransaction extends Transaction ...
Используйте @AttributeOverride для переопределения имен столбцов между двумя типами объектов транзакций, если это необходимо.
Обновление: я вижу, что вы хотите сопоставить одну @Entity с двумя таблицами в том же EntityManagerFactory... Я не думаю, что вы можете это сделать.
Ответ 2
Другой способ сделать это - использовать разделенную таблицу на уровне базы данных, которая затем сделает видимой одну таблицу для вашего java-кода.
Вероятно, это путь общего правила, чем более интеллектуальное разделение, тем быстрее ваши запросы могут быть.
Ответ 3
Вы должны использовать две разные единицы сохранения или два отдельных объекта. На это уже был дан ответ здесь.