LazyInitializationException в игровой структуре - PullRequest
0 голосов
/ 17 февраля 2012

при кодировании функционального теста для моего веб-приложения, использующего playframework, я создал

@Before
public void setup() {
    Fixtures.deleteDatabase();
}
@Test
public void testListTagged() {
    Fixtures.loadModels("data.yml");
    Response response = GET("/books/category/science");
    assertNotNull(renderArgs("books"));
    List<Book> books = (List<Book>)renderArgs("books");
    assertEquals(3,books.size());

, метод listTagged проверяет Cache для объекта карты (String:List<Book>), который содержитсписок книг, принадлежащих к данной категории, и если карта пуста или список пуст, запрос к базе данных выполняется и список отображается как «книги».

public static void listTagged(String category) {
        List<Book> books =null;
        Map<String,List<Book>> tagMap = (Map<String, List<Book>>) Cache.get("tagmap");
        if(tagMap!= null) {
            books = tagMap.get(category);           
        }

        if(tagMap==null || books == null) { 
            books= Book.findTaggedWith(category);
        }
        Book book = null;
        if (books!=null && books.size()>0) {
            book = books.get(0);
        }        
        render(category,book, books);
    }

Класс книги равен

@Entity
public class Book extends Model implements Comparable<Book>{
    @Required
    @Column(unique = true)
    public String isbn;

    @Required
    //@Field
    public String name;
        ...
    @ManyToMany(cascade=CascadeType.PERSIST)
    public Set<Category> categories;
    public Book(String isbn, String name, ...) {
        super();

        this.isbn = isbn;
        this.name = name;
        ...
        this.categories = new TreeSet<Category>();
    }
        ...
public static List<Book> findTaggedWith(String categoryName) {
        Map<String,List<Book>> tagMap = (Map<String, List<Book>>) Cache.get("tagmap");
        if(tagMap==null) {
            tagMap= new HashMap<String,List<Book>>();
        }
        List<Book> books = Book.find("select distinct book from Book book join book.categories as cat where cat.name=:name").bind("name", categoryName).fetch();
        tagMap.put(categoryName, books);
        Cache.add("tagmap", tagMap,"20mn");
        return books;
    }

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

A java.lang.RuntimeException has been caught, java.util.concurrent.ExecutionException: play.exceptions.TemplateExecutionException: failed to lazily initialize a collection of role: models.Book.categories, no session or session was closed

Какрешить это?кто-нибудь может посоветовать, пожалуйста?

1 Ответ

1 голос
/ 17 февраля 2012

вы можете использовать:

@ManyToMany(cascade=CascadeType.PERSIST, fetch=FetchType.EAGER)
public Set<Category> categories;

Это, вероятно, решит проблему. В противном случае вам придется позаботиться о том, чтобы сессия была открытой. Протестировано и сейчас работает

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