Как сопоставить один класс различным таблицам, используя аннотации hibernate / jpa - PullRequest
10 голосов
/ 17 августа 2010

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

У меня есть 2 идентичные таблицы:

  1. tbl_creditcard_approved_txns
  2. tbl_creditcard_declined_txns

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

Я пытаюсь отобразить два разных объекта (по одному для каждой таблицы) в вышеприведенный класс. В старом мире я бы создал два hbm.xml файла, по одному для каждой таблицы, и сопоставил бы их оба с Transaction. Затем я использовал бы имя сущности во время сохранения, чтобы гарантировать сохранение объекта в правильной таблице, в зависимости от обстоятельств.

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

В настоящее время я использую другой подход: я извлек все общие поля (идентичные имена столбцов) в @MappedSuperClass и создал два отдельных класса (по одному для каждой сущности), которые расширяются от суперкласса ( эти классы имеют одни и те же поля с разными именами столбцов, где это применимо).

Ответы [ 3 ]

19 голосов
/ 17 августа 2010

Используя @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 голосов
/ 18 августа 2010

Вы должны использовать две разные единицы персистентности или две отдельные сущности.На этот вопрос уже ответили здесь .

2 голосов
/ 18 августа 2010

Другой способ сделать это - использовать разделенную таблицу на уровне базы данных, которая затем сделает видимой одну таблицу для вашего Java-кода.

Вероятно, это общее правило: чем более умным является разделение, тем быстрее могут выполняться запросы.

...