2016-09-16 7 views
2

たとえば、youtubeのビデオページを作成しましょう。ページがレンダリングされた後あなたは、ビデオをupvoteまたはdownvoteし、コメントすることができます。投票などの操作のためにエンティティを保存する方法

私も同様のケースがあります。タイトルと本文(テキスト)で記事が表示されます。私は投票できるようにユーザーのためのオプションを追加したいと思います。二つのエンティティは次のようになります。

public class Article implements Serializable{ 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private BigInteger id; 

    private User from; 

    private String title; 

    private String body; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "article") 
    private List<VoteArticle> votes = new ArrayList<>(); 
public class VoteArticle implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private BigInteger id; 

    @ManyToOne 
    @JoinColumn(name = "Article_ID", referencedColumnName = "id") 
    private Article article; 

と私はRequestScoped豆中の記事(JSF私が見上げるビューをレンダリングする前に、記事のid article.xhtml?t=4 としてビューのparamを持つビューとセットアップを持っていますArticleBean)、ビューがレンダリングされます。

私たちは皆、Beanが@RequestScopedなので、すべてのフィールドは次のリクエストごとに再初期化されるため、私たちは皆知っています。だから私の質問は、私は操作(投票、コメント)をする必要があるたびにデータベースから記事エンティティを取得する必要がありますか、それとも良い方法がありますか?

私のソリューションは、パラメータビュー ".xhtml?t"を取得し、新しい記事エンティティを作成し、そのIDを設定して使用することです。

私の解決策に問題がありますか?あなたはそのようなケースをどのように実装しますか?ありがとう。

+0

なぜViewScopedを使用しないのですか? –

答えて

0

@RequestScopedの代わりにコントローラコードを@ViewScopedに設定すると、問題が解決するように思えます。

メソッドinit()を作成し、それに@PostConstructアノテーションを付けることができます。 init()内で、アーティクルオブジェクトをデータベースから取得できます。コントローラはビ​​ュースコープであるため、これらのオブジェクトはユーザーがページを離れるまでそのまま残ります。

ajax呼び出しによってViewScopedコントローラでvoteUp()voteDown()などのメソッドを呼び出し、毎回DBから新しく取り込むことなくArticleオブジェクトを変更できます。

+0

返信ありがとうございます、私はビュースコープで試してみましょう – usertest

関連する問題