基本的JPA问题:"无法确定类型:java.util.Set"

san*_*ity 7 java jpa playframework

我刚开始在Play Framework Web应用程序中构建我的JPA架构.我对SQL有一个合理的理解,但我是一个JPA新手,我在第一个障碍时被绊倒了.

从Play教程我假设您只是创建Java类,JPA/Play将自动为您创建架构.

所以我想在两个模型类(Rankable和Tag)之间创建一个ManyToMany关系:

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

而另一类:

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

但我不断收到以下错误:

发生JPA错误(无法构建EntityManagerFactory):无法确定类型:java.util.Set,在表:Rankable,对于列:[org.hibernate.mapping.Column(tags)]

我究竟做错了什么?

ruh*_*kus 7

在我们的例子中,原因是我们在场上有一些注释,有些注释在吸气剂上.换句话说,对于特定字段,注释应该在字段上或在getter上.将它们结合在吸气剂上为我们解决了问题.似乎异常没有显示问题的真正原因.顺便说一句,我们使用这种语法进行了许多注释:

  1. 实体:

    @ManyToMany
    @JoinTable(name = "join_table", joinColumns = { @JoinColumn(name =
    "leftjoinid") }, inverseJoinColumns = { @JoinColumn(name = "rightjoinid") }) 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 实体:

    @ManyToMany
    @JoinTable(name = "join_table", joinColumns = { @JoinColumn(name =
    "rightjoinid") }, inverseJoinColumns = { @JoinColumn(name = "leftjoinid") }) 
    
    Run Code Online (Sandbox Code Playgroud)


san*_*ity 2

最终这似乎起作用了,尽管我不确定为什么:

@Entity
public class Tag extends Model {
    public String name;
    public String description;

    @ManyToMany(mappedBy = "tags", cascade = CascadeType.ALL)
    public Set<Rankable> rankables;
}
Run Code Online (Sandbox Code Playgroud)

@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;
}
Run Code Online (Sandbox Code Playgroud)