今日説明したい解決策の問題は、Hibernateエンティティのフィールドの繰り返しセットです。 もちろん、データベースの正規化の助けを借りて解決できますが、これはサンプリングには不便であり、パフォーマンスに影響します;いくつかの列のために余分な結合を必要とする人はいません。
それで、ある種の会計システムがあると想像してみましょう。どのような組織でも、誰が変更したのか、誰が作成したのか、最後の変更がいつだったのか、誰が作成したのかという履歴を保持することが重要です 実際、どのプロジェクトでも、1つではなく同様のセットを見つけることができます。 その結果、プログラマがこれらのフィールドを作成すると、せいぜいコピーアンドペーストが取得され、同じフィールドに対して新しい名前が作成されることがあります。
この問題を解決する2つの方法を検討したいと思います。
最初の方法
この問題は、 @ Embeddableエンティティを使用して解決できます。
package ru.kabit.entity.embeded; import javax.persistence.Embeddable; import java.util.Date; @Embeddable public class HistoryFields { private Long lastModifierId; private Long creatorId; private Date lastModifyDate; private Date createDate; /* getters and setters */ }
クラスからフィールドを削除し、1つのEmbeddedプロパティを挿入します。 実際には、これらのフィールドを呼び出す前にコードを調べて余分なゲッターを追加することは難しくありませんが、XMLでは、JSPですべての場所を見つけることは困難です。
package ru.kabit.entity; import ru.kabit.entity.embeded.HistoryFields; import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class Post { @Id @GeneratedValue private Long id; @Embedded private HistoryFields historyFields; /* getters and setters */ }
HistoryFieldsの少なくとも1つのフィールドが入力されると、 HistoryFieldsオブジェクトが作成され、これらのフィールドが入力されます。それ以外の場合、オブジェクトはnullになります。 データベース内のフィールドの名前は異なる場合があり、それらを変更するにはアノテーション@AttributeOverrideが使用されます。
このアプローチの利点 :
- フィールドの論理グループは個別のエンティティとして選択されます。フィールドは常に同じ名前で呼ばれます。「正しい方法で」記述することは誰にも起こりません。
- 選択したデータは同じテーブルにあるため、サブクエリなしで選択されます
- これらのフィールドの検索条件は変更されません。
- 本質的に、いくつかのそのようなフィールドがあります
欠点 :
- 場合によっては、一連のフィールドが冗長になることがあり、それらを削除することはできません
- リファクタリングするとき、JSPを手動で変更する必要があります。大規模なプロジェクトでこれを行うのは困難です。すべてを再確認するか、埋め込みフィールドからデータを取得する追加のgetterを作成する必要があります
第二の方法
2番目の解決策は、 @ MappedSuperclassアノテーションを使用することです 。
package ru.kabit.entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.MappedSuperclass; import java.util.Date; @MappedSuperclass public class HistoryEntity { @Id @GeneratedValue private Long id; private Long lastModifierId; private Long creatorId; private Date lastModifyDate; private Date createDate; /* getters and setters */ }
これで、フィールドのセットを持つ基本クラスがあり、同様のセットが表示されたら、それから単純に継承できます。
package ru.kabit.entity; import javax.persistence.Entity; @Entity public class Table1 extends HistoryEntity { private Long otherFieldTable1; public Long getOtherFieldTable1() { return otherFieldTable1; } public void setOtherFieldTable1(Long otherFieldTable1) { this.otherFieldTable1 = otherFieldTable1; } }
このアプローチの利点 :
- 選択したデータは同じテーブルにあるため、サブクエリなしで選択されます
- 作業中のプロジェクトでフィールドを作成する場合、リファクタリングする必要はありません
欠点 :
- 場合によっては、一連のフィールドが冗長になることがあり、それらを削除することはできません
- Javaには多重継承がないため、エンティティが2つのタイプに適している場合、このメソッドは適切ではありません。
おわりに
Hibernateエンティティの一連のフィールドの繰り返しの説明を取り除く方法について説明し、それぞれの長所と短所についても説明しました。 この記事がお役に立てば幸いです。