我的代码如下所示:
@Entity
public class Document extends Model
{
@Id
private Long id;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "developers")
private Set<Tester> developers = new HashSet<>();
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "testers")
private Set<Tester> testers = new HashSet<>();
}
我正在使用JoinTable
注释,否则我最终会使用相同的连接表来获得多对多关系。这很好用,我生成了两个表(开发人员和测试人员)。
我甚至可以正确保存数据。设置开发人员和/或测试人员,然后保存文档实体正常工作。
现在问题在于我做的事情:
Document.find.all()
为了获取可用的文档,开发人员和测试人员字段返回相同的数据,尽管数据库中的数据不同。执行document.getDevelopers()
和document.getTesters()
会使用getDevelopers()
始终隐藏 getTesters()
数据来返回相同的数据。
这是Ebean ORM的一些错误/限制吗?
我正在使用Play 2.3.8
答案 0 :(得分:1)
显式获取字段会返回正确的数据。
只需定义自己的find方法:
public static List<Document> findAll() {
return Ebean.find(Document.class)
.fetch("developers")
.fetch("testers")
.findList();
}
仍然想知道是否有更好的方法......
答案 1 :(得分:0)
我发现一个适用于我的解决方案,无需获取其他表,也没有异常..
而是使用列表本身声明一个包含列表的实体。
@OneToOne(cascade = CascadeType.ALL)
ForeignStories foreignStories = new ForeignStories();
ForeignStories是..
@Entity
@Table(name="foreign_stories")
@SuppressWarnings("serial")
public class ForeignStories extends Model {
@Id
@NotNull
Long id;
@ManyToMany(cascade = CascadeType.ALL)
List<Story> foreignStories = new ArrayList<Story>();
}