Основная проблема JPA: «Не удалось определить тип для: java.util.Set» - PullRequest
7 голосов
/ 25 января 2011

Я только начинаю создавать свою схему JPA в веб-приложении Play Framework. У меня есть разумное понимание 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 таблица: ранжируемая, для столбцов: [org.hibernate.mapping.Column (теги)]

Что я делаю не так?

Ответы [ 3 ]

7 голосов
/ 22 июня 2011

В нашем случае причина была в том, что у нас были некоторые аннотации на поле, а некоторые на геттерах. Другими словами, для конкретного поля аннотации должны быть либо на поле, либо на получателе. Объединение их на добытчиках решило проблему для нас. Похоже, исключение не показывает реальную причину проблемы. Кстати, мы использовали этот синтаксис для многих аннотаций:

  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 голосов
/ 26 января 2011

В конце концов, это сработало, хотя я не уверен, почему:

@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;
}
0 голосов
/ 25 января 2011

Похоже, @ManyToMany не вступает в силу.

Возможно, это некоторая путаница с размещением аннотаций.Убедитесь, что ваши геттеры имеют соответствующие сеттеры (setTags()), а все остальные аннотации также размещаются в свойствах (не в полях).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...