2017-06-05 9 views
0

私はSpring MVCとHibernateでプロジェクトを開始しています。私は、クラス構成に関連するベストプラクティスを心配しています。私は、HibernateのようなORM技術を持つUserというクラスがあったとします。Java Spring MVC + Hibernateクラス構成

をすべて含めるべきかどうかわかりません。は、UserクラスのUserエンティティに関連しています。私は、Hibernateがレイジーローディングによって自動的にパフォーマンスを向上させるので、ユーザーを取得するときにすべてのインスタンス変数を取得しないことを知っています。しかし、Userクラスにあまりにも多くの変数を含めると、Userオブジェクトを照会するのに非常にコストがかかるように感じられます。

は、この例を考えてみましょう:

@Entity 
@Table(name = "Users") 
public class User{ 

private String username; 
private String password; 
private long user_id; 

private Collection<Transaction> transactions; 

} 

ここでは、Userクラスは、トランザクションのコレクションを格納します。各トランザクションは、ユーザがウェブサイト上で行った購入を表す。しかし、すべてのユーザーにトランザクションコレクションを格納する必要はありません。

代わりに、私たちはそうのようなトランザクションテーブルにすることができます。このトランザクションテーブルで

@Entity 
@Table(name = "UserTransactions) 
public class Transaction{ 

    private int user_id; 
    private int order_id; 
    private double amount_paid; 
} 

を、我々はまだすべてのユーザーが行ったすべてのトランザクションを保存することができます。

これは一例にすぎず、Userクラスに格納する必要がなく、独自のテーブルで表現できる変数がさらにたくさんあります。だから私は、Userクラスにこれらの変数をすべて格納することに何らかの害があるかどうか、またはUserクラスに含まれるものを注意深く選択するべきかどうか疑問に思っています。各アプローチの長所と短所は何ですか?

ありがとうございます!

+0

あなたは何を求めようとしていますか?休止状態のエンティティ間の関係を作成する方法は? –

答えて

2

UserとUserTransationの間に1対多の関係があるようです。ユーザーは多くのトランザクションを持つことができ、トランザクションは1人の唯一のユーザーによって行われます。

私はUserにすべてを保存する必要があるのだろうと思っている理由は分かりません。それはいけません。 2つのドメインオブジェクトUserとUserTransactionを1対多の関係(データベース内のUserと(User)Transactionテーブルを使用)で持つ必要があります。次に、Hibernateを使ってユーザに問い合わせるとき、デフォルトでは "lazy-loading"を使ってTransactionとの結合をしません。 Transactionを必要とするデータアクセスパターンの場合、明示的に "フェッチ結合"を行い、ユーザーとそのトランザクションを単一のSQLクエリで取得します。

1

あなたは、データベース内のすべての変数を保存したくない場合は、あなただけのTRANSACTION_IDとUSER_IDがあるより多くのより良いアプローチとなります

@Column(insertable=false, updatable=false) or @transient 

使用して、トランザクションテーブルを使用してそれらを制限して休むことができるすべてのあなたが他のテーブルに格納できるユーザの詳細は、より組織化され、正規化され、オーバーヘッドが少なくなります。

関連する問題