Play框架JPA:如何实现一对多关系?

6

我有一个 Posts 模型,每个帖子都包含 Blocks(也是一个模型)。我在这个网站上使用 play 框架,我想做的是在一个页面上显示 X 篇文章及其所有块。JPA(或 play 框架的实现,不知道哪一个)有 find() 方法,我可以在我的控制器中查询帖子,然后像这样将帖子列表发送到我的视图:

render(postList);

我想知道将每个帖子的块发送到视图的最佳方法是什么。我可以在我的Post模型中添加一个getBlocks()方法,该方法返回一个blocksList,并从视图调用它,但这似乎很混乱,并且会违反MVC的目的,因为块将从视图中获取..(或者我对此有误解吗?)
JPA或Play!是否提供检索与帖子一起检索块的某种方式?
这是我当前的Post模型的样子,没有getter和setter:@Entity
@Table(name="posts")
public class Post extends GenericModel{

    @Id
    @Column(name="post_id")
    private int id;

    @Column(name="post_situation")
    private String situation;

    @Column(name="post_date")
    private Date date;

    @Column(name="post_userid")
    private int userid;

    private List<Block> blockList;
    public List<Block> getBlocks() {
        List<Block> block = null;
        return blockList;
    }

}

我该怎么做呢?


如果“块”是“帖子”的一个组成部分,那么“渲染”如何在没有“块”的情况下呈现一些“帖子”? - toto2
我可能对此有所错误。这是否意味着一旦我创建了我的postList,getBlocks内部的代码就会被执行,并且每个对象都将包含正确的Blocks? - user393964
你将 blockList 声明为 Post 的成员。我假设在 Post 的构造函数中或者其他地方已经在 render 被调用之前对 blockList 进行了初始化。 - toto2
不,它没有被调用。我想也许有一些方法可以让JPA来处理这个问题。 - user393964
好的。我不确定如何做到这一点。但我猜你应该在调用 render 之前初始化你的 blockList - toto2
1个回答

11

只需使用一对多关键字:

@OneToMany
private List<Block> blockList;

然而,不清楚你是否需要 getBlocks 方法。如果只是从数据库获取区块,则不需要使用此方法。

注意:您可能需要阅读更多有关 @OneToMany 的内容。例如,您可以添加选项 @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.REMOVE}),以便在将 Post 从数据库中持久化或删除时,内部的 blockList 也会执行相应操作。


所以我需要在我的代码块中添加 @ManyToOne private Post post;。我还需要 private int postid; 来引用帖子吗,还是只需要对象? - user393964
不,就像我写的一样:@OneToMany是放在blockList字段上的标签。数据库会自动根据这个关键字为每个PostblockList创建一个新表。 - toto2
那么我不需要预先创建一个 SQL 表格吗? - user393964
如果您正确配置了persistence.xml,包括Post.class,则不需要自己创建任何表。但是,在Java创建数据库后,您仍然应该使用一些Java之外的工具来浏览您的数据库并查看其外观。您可能有一些命令行工具或基于浏览器的工具与您的数据库配套。 - toto2
2
这是一个旧的问题和答案...但是...在哪里可以阅读更多关于此的信息?寻找OneToMany的文档证明非常困难! - GreenAsJade

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接