2014-01-15 3 views
1

Выполнение поиска ранее сохраненного объекта «один ко многим». Право является:JPA OneToMany коллекция возвращается как пусто

Book.java:

@Entity 
@Table(name = "Book") 
public class Book { 

    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private Long id; 

    @OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, mappedBy="book", orphanRemoval=true) 
    private Collection<Author> authors; 

    public Collection<Author> getAuthors() { 
     return authors; 
    } 
     ... 

     @Override 
    public String toString() { 
     return "Book [id=" + id + ", authors=" + authors + ", title=" + title 
       + ", isbn=" + isbn + "]"; 
    } 
} 

Author.java:

@Entity 
@Table(name = "Authors") 
public class Author { 

    @Id 
    @GeneratedValue 
    @Column(name="id") 
    private Long id; 

    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="book_id") 
    private Book book; 

     ... 

    @Override 
    public String toString() { 
     return "Author [id=" + id + ", book=" + book + ", firstName=" 
      + firstName + ", lastName=" + lastName + "]"; 
    } 
} 

Игнорирования сомнительной мощности модели данных, код поиска является

long bookID = 10; // saved entity ID 
entityManager.getTransaction().begin(); 
Book savedBook = entityManager.find(Book.class, bookID); 
System.out.println("Book " + savedBook); 
entityManager.getTransaction().commit(); 

, который дает выход

Book Book [id=10, authors=[], title=Treasure Island, isbn=123456] 

Любые идеи, почему авторы пуста?


Retrieving 11... 

Exception in thread "main" java.lang.StackOverflowError 
    at java.lang.Long.toString(Long.java:240) 
    at java.lang.Long.toString(Long.java:100) 
    at java.lang.String.valueOf(String.java:2946) 
    at java.lang.Long.toString(Long.java:733) 
    at java.lang.String.valueOf(String.java:2827) 
    at java.lang.StringBuilder.append(StringBuilder.java:115) 
    at org.hibstore.domain.Book.toString(Book.java:64) 
    at java.lang.String.valueOf(String.java:2827) 
    at java.lang.StringBuilder.append(StringBuilder.java:115) 
    at org.hibstore.domain.Author.toString(Author.java:67) 
    at java.lang.String.valueOf(String.java:2827) 
    at java.lang.StringBuilder.append(StringBuilder.java:115) 
    at java.util.AbstractCollection.toString(AbstractCollection.java:422) 
    at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:501) 
    at java.lang.String.valueOf(String.java:2827) 
    at java.lang.StringBuilder.append(StringBuilder.java:115) 
    at org.hibstore.domain.Book.toString(Book.java:64) 
    at java.lang.String.valueOf(String.java:2827) 
+0

Вам может понадобиться явно вызывать 'getAuthors()' на книгу, прежде чем пытаться напечатать. –

+0

Пробовал это, не работал :( – user1882491

+0

Посмотрите запросы, сгенерированные JPA, и убедитесь, что дочерние запросы запущены, и у вас есть дочерние записи в БД. Надеюсь, вы уже пробовали эту опцию, но все остальное выглядит здесь отлично. –

ответ

2

Проблема может быть при вставке записи. Вам нужно установить родительский элемент в дочерний элемент и добавить дочерний элемент в родительский, например, book.addAuthor(author); и author.setBook(book), поскольку ребенок ведет отношения здесь.

+0

Я не понимаю, как это. Не могли бы вы рассказать мне, что происходит в этом случае? – cst1992

1

Другим решением этой проблемы могло бы установить Entity Автор> книги поле отображение @ManyToOne в @ManyToOne(fetch=FetchType.LAZY, cascade = CascadeType.PERSIST)

+0

Пробовал это, не работал, спасибо за ваш ответ, хотя :) – user1882491

Смежные вопросы