Hibernate Аннотации с коллекцией - PullRequest
0 голосов
/ 23 марта 2011

Я пытаюсь реализовать свою модель, используя аннотации гибернации. У меня есть 3 класса, изображение, человек и теги. Теги - это таблица, состоящая из 4 полей: id, personId, imageId и createDate. У человека есть поля имени, идентификатора, даты рождения и т. Д. Мой класс изображения определяется следующим образом:

@Entity
@Table(name="Image")
public class Image {
    private Integer imageId;
    private  Set<Person> persons = new HashSet<Person>();

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID")
    public Integer getImageId() {
        return imageId;
    }

    public void setImageId(Integer imageId) {
        this.imageId = imageId;
    }

    @ManyToMany
    @JoinTable(name="Tags",
                joinColumns = {@JoinColumn(name="imageId", nullable=false)},
                inverseJoinColumns = {@JoinColumn(name="personId", nullable=false)})
    public Set<Person> getPersons() {
        return persons;
    }

    public void setPersons(Set<Person> persons) {
        this.persons = persons;
    }

Если я удаляю аннотации в методе getPersons (), я могу использовать классы, добавлять и удалять записи. Я хочу получить все теги с изображением, и я пытаюсь использовать набор. Я продолжаю получать следующую ошибку:

org.hibernate.LazyInitializationException - failed to lazily initialize a collection of role: com.exmaple.persons, no session or session was closed

Может кто-нибудь помочь мне и сообщить, что я делаю не так?

Спасибо

Ответы [ 2 ]

5 голосов
/ 23 марта 2011

Это сообщение об ошибке, которое на самом деле не имеет никакого отношения к вашей стратегии сопоставления ассоциаций или аннотациям, означает, что вы пытались получить доступ к загруженной коллекции с отложенным доступом на одном из ваших доменных объектов после закрытия Session.

Решение состоит в том, чтобы либо отключить отложенную загрузку для этой коллекции, либо явно загрузить коллекцию до закрытия Session (например, путем вызова foo.getBars().size()), либо убедиться, что Session остается открытым до тех пор, пока она не будет открыта.больше не нужен.

Если вы не уверены, что такое ленивая загрузка, здесь есть раздел в руководстве по Hibernate .

0 голосов
/ 23 марта 2011

Спасибо за ответ мат.Я сейчас в замешательстве.Мой запрос на получение изображения выглядит следующим образом:

public Image findByImageId(Integer imageId) {
    @SuppressWarnings("unchecked")
    List<Image> images = hibernateTemplate.find(
            "from Image where imageId=?", imageId);
    return (Image)images.get(0);
}

Я подумал, что могу вызвать один запрос hql и, если мои сопоставления верны, он вернет связанные данные.

Iпросматривал этот пример по этой ссылке hibernate mappings :

2.2.5.3.1.3. Unidirectional with join table
A unidirectional one to many with join table is much preferred. This association is described through an @JoinTable.

@Entity
public class Trainer {
    @OneToMany
    @JoinTable(
            name="TrainedMonkeys",
            joinColumns = @JoinColumn( name="trainer_id"),
            inverseJoinColumns = @JoinColumn( name="monkey_id")
    )
    public Set<Monkey> getTrainedMonkeys() {
    ...
}

@Entity
public class Monkey {
    ... //no bidir
}         Trainer describes a unidirectional relationship with Monkey using the join table TrainedMonkeys, with a foreign key trainer_id to Trainer (joinColumns) and a foreign key monkey_id to Monkey (inversejoinColumns).
...