私は春のMVCと休止状態を学んでいます。
Hibernateアノテーションとmysqlを使用したCRUD操作で簡単なサイトを完成させました。今、私はショッピングカートサイトを構築する必要があります、そして私はどのように進めるべきかわかりません。
私は@onetomany、@ Embeddable @id注釈、そしてそれがあまりにも多くのクラスで混乱しています。誰かが休止状態の注釈でそれを達成しましたか
または、プレーンJDBCを選択する必要があります。開始方法がわかりません。
私は春のMVCと休止状態を学んでいます。
Hibernateアノテーションとmysqlを使用したCRUD操作で簡単なサイトを完成させました。今、私はショッピングカートサイトを構築する必要があります、そして私はどのように進めるべきかわかりません。
私は@onetomany、@ Embeddable @id注釈、そしてそれがあまりにも多くのクラスで混乱しています。誰かが休止状態の注釈でそれを達成しましたか
または、プレーンJDBCを選択する必要があります。開始方法がわかりません。
何かがどれほど難しいかは非常に主観的ですが、私が助けてくれることを願っています:)私はあなたのすべての質問に答えようとします...
1)すでに基本以上のことを理解していて、Spring、Java、Hibernate、MySQLを相互に接続しているようです。
注釈は@OneToMany
必要ないかもしれませんが、概念間の関係をどのようにモデル化しているかによって異なります。@OneToMany
プロパティレベルで使用され、結合テーブルを使用して双方向、単方向、または単方向にすることができます。これはさらに調査できる重要な違いですが、今のところ、(私の考えでは)最も単純なバリエーションである双方向を使用してみましょう。エンティティ(この場合はPOJO)間の関係を説明するために使用されます。
モデル化されている関係の例は「1つのスタックオーバーフローの質問には多くのコメントがあります」であり、その逆は「多くのコメントが1つのスタックオーバーフローの質問に属している」ため、によって注釈が付けられ@ManyToOne
ます。関係を「所有する」側のみであり、mappedBy
関係を所有するクラスのメンバーを指定するには、属性を使用する必要があることに注意してください。
@Entity
@Table(name = "question")
public class StackOverflowQuestion {
@Column(name = "the_question")
private String question_text;
public String getQuestionText() { return question_text; }
@OneToMany(mappedBy="comment_text")
private List<Comment> comments = new Vector<Comment>();
public List<Comment> getComments() { return comments; }
}
@Entity
@Table(name = "comment")
public class Comment {
@Column(name = "the_comment")
private String comment_text;
public String getComment() { return comment_text; }
@ManyToOne
private StackOverflowQuestion question;
public Job getStackOverflowQuestion () { return question; }
}
これは、データベーステーブルの質問とコメントに変換されます。
質問には1つの列があります-the_question
コメントには2つの列があります-the_commentとquestion_question_text
2番目の列は、質問とコメントの間のマッピングを維持するために休止状態によって自動的に作成される結合列であり、デフォルトでは次の名前が付けられます。
「所有者側の関係の名前、_(アンダースコア)、および所有者側の主キー列の名前の連結。」
ここから
したがって、質問@Id
テーブルに注釈付きの列があり、各質問に一意の数値(たとえば)識別子を与える場合、結合列はquestion_idという名前で作成されます。
StackOverflowQuestionクラスに以下を追加できます。
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", updatable = false, nullable = false)
private Long id;
public Long getId() { ... }
いずれの場合も、各コメントデータベース行には追加のデータ(question_id)が保持されているため、「特定の質問に対するコメント」を取得できます。@JoinColumn
自動名前生成を注釈でオーバーライドできることに注意してください。
また、これらのクラスのインスタンスが休止状態によって永続化されたときに何が起こるか、具体的には結合列がどのように更新されるかを調べる必要があります。たとえば、質問が作成されてIDが与えられると(つまり、永続化/保存されると)、その質問の各コメントは、永続化される前にCommentインスタンスのquestion_id設定が必要になります。
2)データ間の関係が別のテーブルを保証しない場合は、@Embeddable
(およびその対応物)を使用します。それがいつ必要になるかについて@Embedded
の良い例がここにあります。
3)上記の例のいずれもCRUD用のSQLを必要としないため、プレーンJDBCでは自分でSQLを追加する必要があります。プレーンJDBCとHibernateの長所と短所を説明するサイトはたくさんあり、プレーンJDBCの方が優れたソリューションになる場合があります。
複雑さの少ないソリューション、手書きのSQLがほとんどなく、データベースとJavaクラスのロジックが重複することなく、Javaオブジェクトとデータベース間の強固なリンクが得られるため、休止状態を継続します。(これらは不利であると主張する人もいるかもしれませんが!)。個人的には、データベースが自動的に作成される関係でPOJOのセットを作成できるため、Hibernateアノテーションが好きです。
これがお役に立てば幸いです。遅く、疲れていて、サンプルコードをテストする機会がありませんでした:)