各テーブルに 3 文字のプレフィックスが割り当てられ、それが各列で使用される既存のスキーマがあります。例えば :
テーブル :USER
プレフィックス :USR
フィールド :USR_ID, USR_STATUS, USR_LAN_ID
など
DB担当者はそれを気に入っており、FKフィールドでもテーブル接頭辞を使用しています(例: USR_LAN_ID
whereLAN
はLANGUAGE
テーブルの接頭辞です。SQL(およびPL/SQL)が読みやすくなると言っています。私はこのポリシーに影響を与えていません。
@Column
列を注釈で明示的にマッピングすることにより、JPA でそれを使用できます。とにかく、追加のメタデータ (長さ、null 可能性など) のためにほとんどの場合必要になります。
しかし、すべてのテーブルに共通の約 5 つまたは 6 つの列があり、@MappedSuperclass
. これらのフィールドはID
、 、STATUS
、および監査フィールド (作成、更新ユーザー、および日付) です。
しかし、これらのフィールドは意味的には同じですが、名前が異なるため、機能しません (一度は になりUSR_ID
、別のフィールドは になりますGRP_ID
)。
この問題を回避し、それらのフィールドを共通のスーパークラスに再グループ化し、すべてのエンティティで冗長なボイラープレート コードを回避するには、どのような戦略を使用できますか?
私の最初のアイデアは、 custom を作成しNamingStrategy
、カスタム注釈を獲得する@TablePrefix
ことでしたが、命名戦略は単なる一般的なメカニズムであり、列の名前を生成するときにテーブルの名前またはエンティティ クラスを認識していないため、機能しないようです。 .
拡張できる他の Hibernate クラスはありますか?
助言がありますか ?
これまでのところ、Hibernate をプロバイダーとして JPA 2 を使用しています。しかし、それはまだプロジェクトの初期段階であり、プロバイダーの変更を伴うソリューションを受け入れる可能性があります.
編集:これまでに見つけた「最も悪い」解決策は、各エンティティの列名をオーバーライドすることです。たとえば、 Role エンティティでは、これを class の前に追加します。
@AssociationOverrides( {
@AssociationOverride(name="creationUser", joinColumns=@JoinColumn(name="APR_USR_ID_CREATE")),
@AssociationOverride(name="updateUser", joinColumns=@JoinColumn(name="APR_USR_ID_MODIFY"))
})
@AttributeOverrides({
@AttributeOverride(name = "id", column = @Column(name = "APR_ID")),
@AttributeOverride(name = "status", column = @Column(name = "APR_STATUS")),
@AttributeOverride(name = "creationDate", column = @Column(name = "APR_USR_CREATE_DATE")),
@AttributeOverride(name = "updateDate", column = @Column(name = "APR_USR_MODIFY_DATE"))
})
クラス内のすべてを再定義するよりはましですが、エンティティごとに 10 行の醜い冗長なコードが必要です (エンティティ間で異なるのは、テーブル名の 2 文字のプレフィックス、この場合は "APR_" だけであるため、非常に冗長です)。
うまくいくかもしれない1つのアイデア:カスタム@TablePrefixアノテーションを追加し、基本クラスに応じて、コンパイル時に上記のものを生成するアノテーションプロセッサを実装します...小さな釘のための大きなハンマーかもしれませんが、エンティティの数が高いです、その価値はあります...