Используйте переменную в JPA Annotation для имени таблицы
У меня есть база данных с таблицами, создаваемыми динамически (эти таблицы имеют одинаковую структуру, но к их имени добавляется год, за которым следует номер текущего месяца: data201201, data201202, data201203 ...) Я создал класс сущности с именем Data, который определяет структуру этих таблиц. Я не знаю, как сделать динамическое его использование. Пожалуйста, я хочу, чтобы вы мне помогли! Спасибо!
3 ответа
Это невозможно без создания класса для каждой таблицы, но это будет так же плохо, как иметь таблицу на каждый месяц. Лучший совет - нормализовать вашу схему, храня всю информацию в одной таблице, имеющей year
и month
колонка.
Для этого вы можете использовать динамическую сущность EclipseLink или многопользовательскую таблицу для каждой поддержки арендатора.
http://wiki.eclipse.org/EclipseLink/Examples/JPA/Dynamic
http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_multitenant.htm
Кроме того, некоторые базы данных, такие как Oracle, поддерживают разбиение таблиц, так что вам не нужна новая физическая таблица в месяц.
Вы также можете определить представление, которое выбирается из текущего месяца, чтобы объединить соответствующие месяцы и отобразить его в представление.
Невозможно изменить отображение во время выполнения. В вашем случае вы можете объединить все свои таблицы в одну и использовать комбинацию @Inheritance и @DiscriminatorColumn
РЕДАКТИРОВАТЬ
ты комбинированный стол
GLOBAL_DATE_TABLE
{
number : ID
varchar : MONTH <- this will be discriminator column
varchar : NAME
... all another fields
}
ваше отображение
@Entity
@Table(name="GLOBAL_DATE_TABLE")
@Inheritance(strategy=SINGLE_TABLE)
@DiscriminatorColumn(name="MONTH", discriminatorType=STRING)
public class Date
{
@Column(name = "ID")
@Id
private long id;
@Column(name = "NAME")
private String name;
// another fields
}
@Entity
@DiscriminatorValue("data201201")
public class Data201201
{
// if column MONTH contains value "ata201201" this instance will be created
// logic for this table here
}
@Entity
@DiscriminatorValue("data201202")
public class Data201202
{
// if column MONTH contains value "ata201202" this instance will be created
// logic for this table here
}
@Entity
@DiscriminatorValue("data201203")
public class Data201203
{
// if column MONTH contains value "ata201203" this instance will be created
// logic for this table here
}