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
我该如何解决这个问题?有人可以请指教?
感谢您的答复..putting fetch = fetchType.EAGER不能解决它..因为这些是单独的单元测试,我该如何保持会话打开? – 2012-02-17 13:45:20
我还没有与playframework合作过,但entityManger的会话在您想要访问类别时不可用。因此这些类别不能被提取。通常EAGER应该使类别与书籍一起取得。只是猜测:也许使用“Cache.get()”以外的东西 – AlexS 2012-02-17 14:00:00