私は動的に作成されたテーブルを持つデータベースを持っています (これらのテーブルは同じ構造を持っていますが、名前の末尾に年と現在の月の数字が続きます: 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 などの一部のデータベースはテーブルのパーティショニングをサポートしているため、毎月新しい物理テーブルは必要ありません。
また、現在の月から選択するビューを定義して、関連する月を結合し、ビューにマップすることもできます。
実行時にマッピングを変更することはできません。あなたの場合、すべてのテーブルを1つに結合し、代わり に@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
}