让我们以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中重新拉出它。