Hibernate Annotation for Entity, существующий более чем в 1 каталоге

У меня есть объект Person, сопоставленный Hibernate с таблицей базы данных в каталоге базы данных «Активно». Через некоторое время записи в этой таблице базы данных в каталоге «Активный» архивируются/перемещаются в точную копию таблицы в каталоге базы данных «История». Мне нужно получить как из каталогов Active, так и из History. Есть ли лучший способ смоделировать это с помощью аннотаций Hibernate, чем создать абстрактный класс, из которого расширяются 2 класса.

Это то, что у меня есть сейчас.

@MappedSuperclass
public abstract class Person  {

    @Id
    private Integer id;
    private String name;
}

@Entity
@Table(name="Person", catalog="Active")
public class PersonActive extends Person {
}

@Entity
@Table(name="Person", catalog="History")
public class PersonHistory extends Person {
}

person Daniel Spivey    schedule 04.03.2010    source источник


Ответы (3)


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

PS: Можете ли вы добавить указатель того, как это сделать с файлами сопоставления, мне действительно любопытно.

person Pascal Thivent    schedule 04.03.2010
comment
Спасибо за понимание. В прошлом, когда у меня было это бизнес-требование с другими проектами, в которых я использовал Spring JDBC, у меня был бы только один класс и один сопоставитель строк для обеих таблиц. Я не делал этого раньше с спящим режимом, но вот пример old.nabble.com/ ‹hibernate-mapping› ‹class table=CLASS name=some.my.Class› (...) ‹/class› ‹ class entity-name=archived table=ARCHIVED_CLASS name=some.my.Class› (...) ‹/class› ‹/hibernate-mapping› - person Daniel Spivey; 04.03.2010

Моя мысль состояла в том, чтобы написать запрос для выбора обеих таблиц из базы данных A и B. Затем создать запрос с помощью спящего режима и сопоставить его с вашим классом.

пример:

@Entity
@NamedNativeQuery(
name="GetAllPerson",
query="select * from A.Person inner join B.Person on A.Person.Id = B.Person.Id"
)
public class Person  {
...
}

Не уверен, что это сработает, ваш вопрос также заставил меня задуматься о том, как лучше всего это сделать :). Вечером после работы проверю, все ли в порядке.

person Elio    schedule 10.05.2011

Я думаю, что есть подпроект hibernate с именем осколки. Он предназначен для работы с несколькими реляционными базами данных. Если вы хотите использовать его, вам могут потребоваться большие изменения в вашем коде.

person AmirMV    schedule 10.05.2011