如何保存实体以进行投票等操作

时间:2016-09-16 14:46:00

标签: jsf jsf-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;

我的jsf视图有一个视图参数作为文章的标识article.xhtml?t=4 在渲染视图之前,我在RequestScoped Bean(ArticleBean)中查找并设置文章,然后渲染视图。

现在我们都知道,因为bean是@RequestScoped,所有字段都会针对每个下一个请求重新初始化。所以我的问题是,每次我需要进行操作(投票,评论)还是有更好的方法时,我是否需要从数据库中获取文章实体?

现在我的解决方案是采用参数视图“.xhtml? t ”并创建一个新的文章实体,设置其ID并使用它。

我的解决方案有问题吗?你是如何实施这种情况的?感谢。

1 个答案:

答案 0 :(得分:0)

听起来好像将控制器代码设置为@ViewScoped而不是@RequestScoped会解决您的问题。

你可以创建一个方法init()并给它一个@PostConstruct注释。在init()中,您可以从数据库中提取Article对象。因为控制器是视图范围的,所以这些对象将一直保留到用户离开页面。

您可以通过ajax调用在ViewScoped控制器上调用voteUp()voteDown()等方法,并修改Article对象,而不必每次都从数据库中提取新内容。