2012-02-17 59 views
0

同时编码功能测试针对使用playframework我的web应用程序,我创建LazyInitializationException中在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方法包含的属于书籍列表地图对象(String:List<Book>)检查Cache给定类别,如果映射为空或列表为空,则进行数据库查询并将列表呈现为“书籍”。

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); 
    } 

Book类是

@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

你可以使用:

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

这可能会解决这个问题。否则,你必须小心,会议是开放的。测试和现在的工作

+0

感谢您的答复..putting fetch = fetchType.EAGER不能解决它..因为这些是单独的单元测试,我该如何保持会话打开? – 2012-02-17 13:45:20

+0

我还没有与playframework合作过,但entityManger的会话在您想要访问类别时不可用。因此这些类别不能被提取。通常EAGER应该使类别与书籍一起取得。只是猜测:也许使用“Cache.get()”以外的东西 – AlexS 2012-02-17 14:00:00

相关问题