我有2种型号Article.java
和Tags.java
。 的Article
可以有很多Tags
,并且Tags
可以属于很多Article
。 我真的有麻烦了使用JPA,使这个关系和播放框架1.2.5。 下面是我的代码(没有setter方法的getter),实际上它的作品甚至抛出异常,但我不能让Tags
( getTagname()
一)的Article
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>();
}
我做这样的事情上面提供的代码(使用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>();
}
然后,在数据库上,我手动添加测试用的几个记录:
文章 (ID;标题)> 1; “Java示例”和6; “第一条”
标签 (ID; TAG_NAME)> 4; “Java”的和5; “playframework”
article_tag(articles_id; tags_id)> 6; 4和6; 5和1; 4
那么,我与控制器动作测试它:
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>
最后,其结果是可以预料的是什么:
UPDATE
这@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}