Смешивание наследования JOINED и SINGLE_TABLE с использованием аннотаций

Я искал на форуме похожие вопросы, но не нашел ничего, что касалось бы того, что я ищу (по крайней мере, то, что я могу сказать).

У меня есть ситуация, когда у нас есть несколько клиентов с несколькими типами запросов каждый. Я пытался создать родительскую таблицу «Запрос», которая разделяется на дочернюю таблицу для каждого клиента - «ClientARequest», «ClientBRequest». Оттуда у меня было бы несколько классов, которые сопоставляются с одной и той же клиентской таблицей. «ClientARequest1» и «ClientARequest2» сопоставляются с «ClientARequest» и аналогичны для ClientB. Я могу заставить первую часть работать без проблем с наследованием JOINED. Я могу получить второй рабочий, чтобы сэкономить. Однако при извлечении спящий режим создает экземпляр последнего сопоставленного класса, поэтому в зависимости от того, как я использую извлеченный объект, я получу исключение ClassCastException или у меня не будет правильных данных, потому что это неправильный класс.

@Entity(name="Request")
@Table(name = "REQUEST")
@Inheritance(strategy=InheritanceType.JOINED)  
@DiscriminatorColumn(name="MY_TYPE", discriminatorType=DiscriminatorType.STRING)
public class Request  { ... }

@Entity(name="ClientARequest1")
@Table(name = "CLIENTAREQUEST")
@DiscriminatorValue("ClientA")
public class ClientARequest1 extends Request { ... }

@Entity(name="ClientARequest2")
@Table(name = "CLIENTAREQUEST")
@DiscriminatorValue("ClientA")
public class ClientARequest2 extends Request { ... }

То же самое и для ClientB:

@Entity(name="ClientBRequest1")
@Table(name = "CLIENTBREQUEST")
@DiscriminatorValue("ClientB")
public class ClientBRequest1 extends Request { ... }

@Entity(name="ClientBRequest2")
@Table(name = "CLIENTBREQUEST")
@DiscriminatorValue("ClientB")
public class ClientBRequest2 extends Request { ... }

Итак, как я уже упоминал, создаются три таблицы: Request, ClientARequest и ClientBRequest, и это не проблема с различением таблиц. Именно при попытке выборки из таблицы спящий режим использует 2-е сопоставления для создания экземпляра класса.

Ex.

ClientARequest1 r = new ClientARequest1("ClientA");
dao.save(r);

Работает, как ожидалось.
Однако для:

Request r = (Request) dao.findById(1l);  //where id==1 is a ClientARequest1

фактически откатит ClientARequest2.

Любые мысли были бы очень признательны. Это решение невыполнимо, есть ли способ разбить таблицы на другой уровень?

26.02.13, 11:19 EST:
Я попытался найти решение в этой ветке Как смешивать стратегии наследования с аннотациями JPA и Hibernate?, но я не смог правильно сопоставить подклассы BB1, BB2, CC1, CC2, поскольку их свойства были бы помещены в базовую родительскую таблицу A. Я бы хотел, чтобы их свойства были помещены в их прямые родительские таблицы BB, CC соответственно.


person mark    schedule 25.02.2013    source источник


Ответы (1)


Я понял. Я следил за решением, найденным в Как смешивать стратегии наследования с Аннотации JPA и Hibernate?. Единственное, что я изменил, - это добавление @MappedSuperclass на уровень BB, CC и перемещение @Entity и @SecondaryTable на уровень BB1, BB2, CC1, CC2.

person mark    schedule 26.02.2013