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

时间:2011-01-25 18:43:47

标签: java jpa playframework

我刚开始在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(标签)]

我做错了什么?

3 个答案:

答案 0 :(得分:7)

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

  1. 实体:

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

    @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()),所有其他注释也放在属性上(而不是在字段上)。