4

各テーブルに 3 文字のプレフィックスが割り当てられ、それが各列で使用される既存のスキーマがあります。例えば ​​:

テーブル :USER プレフィックス :USR フィールド :USR_ID, USR_STATUS, USR_LAN_IDなど

DB担当者はそれを気に入っており、FKフィールドでもテーブル接頭辞を使用しています(例: USR_LAN_IDwhereLANLANGUAGEテーブルの接頭辞です。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アノテーションを追加し、基本クラスに応じて、コンパイル時に上記のものを生成するアノテーションプロセッサを実装します...小さな釘のための大きなハンマーかもしれませんが、エンティティの数が高いです、その価値はあります...

4

1 に答える 1

0

@AttributeOverrides を使用して、@Entity でプレフィックス付きの列名を指定できます。しかし、プレフィックスを一度だけ宣言する方法はありません。

この質問を参照してください: JPA 複数の埋め込みフィールド

于 2013-09-03T10:56:41.630 に答える