Вопрос о спящем отображении - PullRequest
0 голосов
/ 11 января 2011

Я пытаюсь установить отношение «многие ко многим», используя аннотации.вот мои сущности

@Entity
public class Publisher{
        @Id
        public int id;
   public String name;
}
@Entity
public class PublisherBook{
        @Id
        public int id;
        @ManyToOne(cascade=CascadeType.ALL)
   @JoinColumn(name="bookId",nullable=false)
        public Book book;
        @ManyToOne(cascade=CascadeType.ALL)
   @JoinColumn(name="publisherId",nullable=false)
        public Publisher Publisher;
}

@Entity
public class Book{
        @Id
        public int id;
   public String name;
        @OneToMany(fetch=FetchType.EAGER, mappedBy="book")
   public Set<BookAuthor> authors;
}
@Entity
public class BookAuthor{
        @Id
        public int id;
        @ManyToOne(cascade=CascadeType.ALL)
   @JoinColumn(name="bookId",nullable=false)
        public Book book;
        @ManyToOne(cascade=CascadeType.ALL)
   @JoinColumn(name="authorId",nullable=false)
        public Author author;
}

@Entity
public class Authors{
        @Id
        public int id;
   public String name;
}

Вот примерный набор данных, которые у меня есть для сущностей

Author:( id,name)
1, Author 1
2, Author 2
3, Author 3

Book: (id, name )
1, Book 1
2, Book 2
3, Book 3

Publisher(id,name)
1, Publisher 1
2, Publisher 2
3, Publisher 3

BookAuthor (id, bookId, authorId)
1, 1, 1
2, 1, 2
3, 1, 3
4, 2, 1
5, 3, 2

PublisherBook(id, publisherId, bookId)
1, 1, 1
2, 1, 2
3, 1, 3
4, 2, 1
5, 3, 2

Если я попытаюсь получить список всех книг для издателя 1 (id =1) из таблицы PublisherBook необходимо вернуть всего 3 книги.Но я получаю в общей сложности 5 книг.Книга 1 (id = 1) повторяется 3 раза с различными значениями автора (1, 2, 3). Таким образом, список PublisherBook возвращает

1, 1, 1
1, 1, 1
1, 1, 1
2, 1, 2
3, 1, 3

Если я удаляю сущность Set from Book, списокPublisherBook для издателя 1 возвращает правильные значения

1, 1, 1
2, 1, 2
3, 1, 3

Может кто-нибудь сказать мне, что я делаю не так?Извиняюсь за длинный пост.

1 Ответ

1 голос
/ 11 января 2011

Это эффект из-за стратегии загрузки hibernate. Вы определили отношение «авторы» как выборку EAGER, что приведет к присоединению таблицы AUTHOR.

Поэтому во избежание этого вы можете либо определить это отношение как LAZY (которое может иметь другие положительные или отрицательные последствия для вашего приложения), либо использовать преобразователь результата:

criteria.setResultTransformer (Criteria.DISTINCT_ROOT_ENTITY);

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