Hibernate: объект данных с динамическим именем таблицы по аннотациям - PullRequest
9 голосов
/ 20 декабря 2011

У меня есть класс данных для Hibernate, связанный с таблицей; представьте себе сущность личность вот так:

 @Entity
 @org.hibernate.annotations.Proxy(lazy=false)
 @Table(name="Person", schema="MySchema")
 @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
 public class ProfileData implements Serializable {

    private static final long serialVersionUID = -844564646821609090L;

    public PersonData() {
    }

    @Column(name="idPerson", nullable=false, unique=true)   
    @Id 
    ...

Мне нужно создать хронологические таблицы по годам этой таблицы : Person2010, Person2011, Person2012 ... Возможно ли это без создания новых объектов данных? Может по параметру ...? Я не знаю.

Класс Entity является тем же, изменяя имя таблицы и конструктор.

Ответы [ 6 ]

19 голосов
/ 02 января 2012

Другая архитектура, более полная, но элегантная:

ДА . Вы можете изменить имена таблиц, используя NamingStrategies :

public class MyNamingStrategy extends DefaultNamingStrategy {
   ...
   @Override
   public  String tableName(String tableName) {
      return tableName+yearSuffixTable;
   }
   ...
}

И, когда вы хотите использовать таблицы _year, вы должны создать сеанс с Hibernate, который переопределяет имена таблиц:

  SessionFactory sessionFactory;
  Configuration config = new AnnotationConfiguration()
                         .configure("hibernate.cfg.xml")
                         .setNamingStrategy( new MyNamingStrategy () );
  sessionFactory = config.buildSessionFactory();
  session = sessionFactory.openSession();

Для моей архитектуры я создаю сеанс по годам и сохраняю его в карте приложений длядоступ, когда мне это нужно.

Спасибо.

3 голосов
/ 20 декабря 2011

Вы должны попробовать Hibernate Envers для исторических данных.

1 голос
/ 09 февраля 2012
@Table(name="emd_employee_1001")

В приведенной выше аннотации имя файла может передаваться как параметр, например

x=1001 
@Table(name="emd_employee_+x+")
1 голос
/ 26 декабря 2011

Благодаря @CodeBrickie и @edutesoy я нашел Энверса.

Я настраиваю файл конфигурации hibernate с суффиксом AUD и создаю новые файлы конфигурации hibernate в год (hibernate.cfg.2009.xml, hibernate.cfg.2010.xml, hibernate.cfg.2011.xml ...) с суффикс года.

Когда я сохраняю данные, всегда проверяется в таблице AUD. 1 января автоматически:

  • _AUD TABLE переименовывается в таблицу _PAST_YEAR.
  • Создана новая таблица _AUD.
  • Новый hibernate.cfg.past_year.xml создается с новым суффиксом.

Когда мне нужно получить данные, я загружаю соответствующий файл конфигурации Hibernate.

Надеюсь, это поможет другим:)

1 голос
/ 20 декабря 2011

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

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

0 голосов
/ 17 апреля 2017

Изменено во время выполнения (я думаю, что это лучший способ):

Session session = super.getSession();
    SQLQuery query = session.createSQLQuery("raw sql");
    query.setParameter(":abc", "value");
    query.addEntity(Some.class);
    return query.list();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...