我刚开始在Play Framework Web应用程序中构建我的JPA架构。我对SQL有一个合理的理解,但我是一个JPA新手,我在第一个障碍时被绊倒了。
在Play教程中,我假设您只是创建Java类,JPA / Play将自动为您创建架构。
所以我想在两个模型类之间创建一个ManyToMany关系,Rankable和Tag:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Rankable extends Model {
public String name;
private Set<Tag> tags;
@ManyToMany()
@JoinTable(name = "RANKABLE_TAGS")
public Set<Tag> getTags() {
return tags;
}
@ManyToMany()
@JoinTable(name = "RANKABLE_TAGS")
public void setTags(final Set<Tag> tags) {
this.tags = tags;
}
}
另一堂课:
@Entity
public class Tag extends Model {
public String name;
public String description;
private Set<Rankable> rankables;
@ManyToMany(mappedBy = "tags")
public Set<Rankable> getRankables() {
return rankables;
}
@ManyToMany(mappedBy = "tags")
public void setRankables(final Set<Rankable> r) {
rankables = r;
}
}
但我一直收到以下错误:
发生JPA错误(无法构建 EntityManagerFactory):不能 确定类型:java.util.Set,at table:Rankable,对于列: [org.hibernate.mapping.Column(标签)]
我做错了什么?
答案 0 :(得分:7)
在我们的案例中,原因是我们在该领域有一些注释,有些在吸气剂上。换句话说,对于特定字段,注释应该在字段上或在getter上。将它们结合在吸气剂上为我们解决了问题。似乎异常没有显示问题的真正原因。 顺便说一下,我们将这种语法用于许多注释:
实体:
@ManyToMany
@JoinTable(name = "join_table", joinColumns = { @JoinColumn(name =
"leftjoinid") }, inverseJoinColumns = { @JoinColumn(name = "rightjoinid") })
实体:
@ManyToMany
@JoinTable(name = "join_table", joinColumns = { @JoinColumn(name =
"rightjoinid") }, inverseJoinColumns = { @JoinColumn(name = "leftjoinid") })
答案 1 :(得分:2)
最后这似乎有效,虽然我不确定原因:
@Entity
public class Tag extends Model {
public String name;
public String description;
@ManyToMany(mappedBy = "tags", cascade = CascadeType.ALL)
public Set<Rankable> rankables;
}
和
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Rankable extends Model {
@ManyToOne(cascade = CascadeType.ALL)
public User creator;
public String name;
@ManyToMany()
public Set<Tag> tags;
}
答案 2 :(得分:0)
看起来@ManyToMany
没有生效。
也许这与注释的放置有些混淆。确保你的getter有相应的setter(setTags()
),所有其他注释也放在属性上(而不是在字段上)。