让我们以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并使用它。
我的解决方案有问题吗?你是如何实施这种情况的?感谢。
答案 0 :(得分:0)
听起来好像将控制器代码设置为@ViewScoped而不是@RequestScoped会解决您的问题。
你可以创建一个方法init()并给它一个@PostConstruct注释。在init()中,您可以从数据库中提取Article对象。因为控制器是视图范围的,所以这些对象将一直保留到用户离开页面。
您可以通过ajax调用在ViewScoped控制器上调用voteUp()voteDown()等方法,并修改Article对象,而不必每次都从数据库中提取新内容。