【问题标题】:Play framework JPA: how to implement one-to-many relationship?播放框架JPA:如何实现一对多关系?
【发布时间】:2011-09-09 13:55:56
【问题描述】:

我有一个Posts 模型,每个帖子还包含Blocks(也是一个模型)。我正在使用这个网站的播放框架,我想要做的是在一页上显示 X 个帖子以及所有这些块。 JPA(或 play framework 的实现,不知道是哪一个)有 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;
    }

}

我应该怎么做?

【问题讨论】:

  • 如果blockspost 的一个组成部分,那么render 如何在没有blocks 的情况下呈现一些post
  • 我可能错了。这是否意味着一旦我创建了我的 postList,getBlocks 中的代码就会被执行,并且每个对象都将包含正确的 Blocks?
  • 您将blockList 声明为Post 的成员。我假设某处(Post 的构造函数?)blockListrenderPost 调用之前被初始化。
  • 不,它没有被调用。我想也许有办法让 JPA 来处理这个问题..
  • 好的。我不知道该怎么做。但我想你应该在调用 render 之前初始化你的 blockList

标签: java sql model-view-controller jpa playframework


【解决方案1】:

只需使用一对多关键字:

@OneToMany
private List<Block> blockList;

但不清楚您是否需要getBlocks 方法。如果你只是从数据库中获取块,那么你不需要这个方法。

注意:您可能想在@OneToMany 上阅读更多内容。例如,您可以添加选项@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.REMOVE}),这样当您从数据库中持久化或删除Post 时,内部的blockList 也会这样做。

【讨论】:

  • 所以我需要将@ManyToOne private Post post; 添加到我的块中。我还需要private int postid; 来引用帖子还是只引用对象?
  • 不,就像我写的那样:@OneToMany 是字段blockList 上的标签。数据库使用该关键字自动为每个PostblockList 创建一个新表。
  • 所以我不需要预先创建SQL表?
  • 如果您正确配置了persistence.xml,包括Post.class,则您不必自己创建任何表。但是您仍然应该使用 Java 之外的一些工具在由 Java 创建数据库后导航您的数据库并查看它的外观。您的数据库中可能有一些命令行工具或基于浏览器的工具。
  • 这是一个古老的问题和答案......但是......在哪里可以阅读更多关于这个的信息?事实证明,为 OneToMany 找到 doco 非常困难!
猜你喜欢
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多