我正在做类似于你提供的代码(并使用Play 1.2.5),但是似乎发现了你提供的代码存在问题。以下是我的步骤:
首先,我创建了两个模型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;title)> 1;"java示例"和6;"文章1"
标签(id;tag_name)> 4;"java"和5;"playframework"
文章标签(articles_id;tags_id)> 6;4和6;5和1;4
然后,我使用控制器操作进行测试:
public static void test() {
Article article = Article.findById(6L);
Tag tag_java = Tag.findById(4L);
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}