【问题标题】:Basic JPA issue: "Could not determine type for: java.util.Set"基本 JPA 问题:“无法确定类型:java.util.Set”
【发布时间】:2011-01-25 18:43:46
【问题描述】:

我刚刚开始在 Play Framework 网络应用程序中构建我的 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;
    }
}

还有其他类:

@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,在 表:可排名,对于列: [org.hibernate.mapping.Column(tags)]

我做错了什么?

【问题讨论】:

  • @kem - Model 是框架的类之一
  • 是你的代码中多余的} 还是只是一个发布错误?

标签: java jpa playframework


【解决方案1】:

在我们的例子中,原因是我们在字段上有一些注释,而在 getter 上有一些注释。换句话说,对于特定的字段,注释应该在字段上或在 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") }) 
    

【讨论】:

  • 一对一怎么样?是一样的吗?
【解决方案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;
}

【讨论】:

    【解决方案3】:

    @ManyToMany 好像没有生效。

    也许注释的位置有些混乱。确保您的 getter 具有相应的 setter (setTags()),并且所有其他注释也放置在属性上(而不是字段上)。

    【讨论】:

    • 啊,没有对应的setter。它们是否需要与 setter 具有相同的注释?
    • 不,我添加了 setter - 所有注释都在方法上,而不是字段上(我目前只有两个模型对象,并且都粘贴在上面)。仍然得到同样的错误:-(
    • 您不需要在 Play Framework 模型中声明 setter,因为它们是在编译时由框架为您动态生成的。
    • 感谢 Mark,要跟踪所有 Play Framework 的“魔法”可能很困难 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 2016-09-20
    • 1970-01-01
    • 2013-03-28
    • 2013-07-26
    • 1970-01-01
    • 2016-10-04
    相关资源
    最近更新 更多