与 Play Framework 1.2.5 JPA 的多对多关系

Posted

技术标签:

【中文标题】与 Play Framework 1.2.5 JPA 的多对多关系【英文标题】:ManyToMany Relation with Play Framework 1.2.5 JPA 【发布时间】:2013-04-29 19:29:56 【问题描述】:

我有 2 个模型 Article.javaTags.java。一个Article 可以有多个Tags,一个Tags 可以属于多个Article。我真的很难使用 JPA 和 Play Framework 1.2.5 建立这种关系。下面是我的代码(没有setter-getter),实际上它甚至可以抛出异常但我无法获得ArticleTagsgetTagname()

Article article = Article.findById((long)id);
List<Tags> tags = article.getTags();

for (Tags tags2 : tags) 
    System.out.println(tags2.getTagname());

这是我的模型,Article.java

@Entity
public class Article extends Model

    @Required
    public String title;

    @Required
    public String link;

    @Required
    @Lob
    public String description;

    public Date date;

    @ManyToMany(cascade=CascadeType.ALL)
    public List<Tags> tags = new ArrayList<Tags>();

Tags.java

@Entity
public class Tags extends Model 

    @Required
    public String tagname;

    @ManyToMany(mappedBy="tags") 
    public List<Article> tagsInArticle = new ArrayList<Article>(); 

【问题讨论】:

“我无法获取标签”是什么意思?发生什么了?有什么例外吗?如果是这样,堆栈跟踪是什么? 【参考方案1】:

我正在执行与您上面提供的代码类似的操作(并使用 Play 1.2.5),您提供的代码似乎存在问题。以下是我的步骤:

首先,我创建了 2 个模型 Article.java

package models;

import play.data.validation.Required;
import play.db.jpa.Model;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import java.util.ArrayList;
import java.util.List;

@Entity
@Table(name = "article")
public class Article extends Model 
    @Required
    public String title;

    @ManyToMany(cascade = CascadeType.ALL)
    public List<Tag> tags = new ArrayList<Tag>();

Tag.java

package models;

import play.data.validation.Required;
import play.db.jpa.Model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import java.util.ArrayList;
import java.util.List;

@Entity
@Table(name = "tag")
public class Tag extends Model 
    @Required
    @Column(name = "tag_name")
    public String tagName;

    @ManyToMany(mappedBy = "tags")
    public List<Article> articles = new ArrayList<Article>();

然后,在数据库上,我手动添加了几条记录以供测试:

article (id;title) > 1;"java example" and 6;"article1"

tag (id;tag_name) > 4;"java" and 5;"playframework"

article_tag (articles_id;tags_id) > 6;4 和 6;5 和 1;4

那么,我用 controller 动作测试它:

public static void test() 
    Article article = Article.findById(6L); // find "article1"
    Tag tag_java = Tag.findById(4L); // find java tag
    render(article, tag_java);

并在下面查看

#extends 'main.html' /

<h3>Article Title : $article?.title</h3>

Tags:<br>
<ol>
#list article?.tags, as:'tag'
    <li>$tag.tagName</li>
#/list
</ol>

All article tagged <b>java</b> :
<ul>
#list tag_java?.articles, as:'java_article'
    <li>$java_article.title</li>
#/list
</ul>

最后,结果是预期的:


更新

这个@ManyToOne 关系是双向的。提供单个数据文章,我们可以拥有该文章的所有标签,并且所有这些标签都可以具有与每个标签对应的所有文章数据。控制器代码类似,但没有直接传递Tag 对象,视图如下所示:

#extends 'main.html' /

<h3>Article Title : $article?.title</h3>

Tags:<br>
<ol>
#list article?.tags, as:'tag'
    <li>$tag.tagName</li>
#/list
</ol>

#list article?.tags, as:'tag'
Related article [tagged with $tag.tagName]:<br>
<ol>
    #list tag?.articles, as:'article'
        <li>$article.title</li>
    #/list
</ol>
#/list

【讨论】:

但是,朋友,它似乎没用。为什么要尝试使用 findbyId 获取标签。所以这意味着你的表之间没有关系。我需要有人告诉我如何在两边设置 ManyToMany 关系,这样我就可以查询不是这篇文章的所有标签,而是所有有这个标签的文章 是的朋友,使用@ManyToMany 可以使关系成为双向的。请参阅我上面的更新答案。抱歉回复晚了。

以上是关于与 Play Framework 1.2.5 JPA 的多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

Play framework 1.2.5 应用启动慢

Play Framework 1.2.5.1 和 1.2.6 版本之间的区别?

使用 Play Framework 1.2.5 访问 Web 服务

如何在 play framework 1.2.5 中验证 REST

Play Framework 1.2.5 - 添加到 <script> 标签

使用 Play Framework 1.2.5 自定义验证 Map<Locale, String>