Я искал на форуме похожие вопросы, но не нашел ничего, что касалось бы того, что я ищу (по крайней мере, то, что я могу сказать).
У меня есть ситуация, когда у нас есть несколько клиентов с несколькими типами запросов каждый. Я пытался создать родительскую таблицу «Запрос», которая разделяется на дочернюю таблицу для каждого клиента - «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 соответственно.