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



让我们以YouTube视频页面为例。在页面呈现之后。你可以给视频投赞成票或反对票,并发表评论。

我这里也有类似的情况。显示文章的标题和正文(文本)。我想为用户添加一个选项,让他们可以投票。两个实体看起来像这样:

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视图,有一个视图参数作为文章的id article.xhtml?t=4在渲染视图之前,我在RequestScoped Bean (ArticleBean)中查找并设置文章,然后渲染视图。

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

现在我的解决方案是采取参数视图".xhtml?t"并创建一个新的Article实体,设置它的Id并使用它。

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

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

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

您可以通过ajax调用在ViewScoped控制器上调用voteUp() voteDown()等方法,并修改您的Article对象,而无需每次从DB中重新拉出它。

相关内容

  • 没有找到相关文章

最新更新