Hibernateの重複フィールドセット



今日説明したい解決策の問題は、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が使用されます。



このアプローチの利点



欠点



第二の方法



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; } }
      
      





このアプローチの利点



欠点



おわりに



Hibernateエンティティの一連のフィールドの繰り返しの説明を取り除く方法について説明し、それぞれの長所と短所についても説明しました。 この記事がお役に立てば幸いです。



All Articles