2015-06-11 113 views
0

我正在做一个SSH项目的JUnit。 首先,我在做一个@Test方法时遇到了org.hibernate.LazyInitializationException。我做了一些研究并解决了它。 我所做的是添加用于绑定会话资源的Setup和TearDown。奇怪的org.hibernate.LazyInitializationException什么时候做JUNIT

这2个方法是这样的:

@Before 
public void setup(){ 
    System.out.println("Setup() running...."); 
    String filename = "WebContent\\WEB-INF\\classes\\applicationContext.xml"; 
    ctx = new FileSystemXmlApplicationContext(filename); 
    sf = (SessionFactory) ctx.getBean("sessionFactory"); 
    Session s = sf.openSession(); 
    TransactionSynchronizationManager.bindResource(sf, new SessionHolder(s)); 
} 

@After 
public void tearDown(){ 
    System.out.println("TearDown() running...."); 
    SessionHolder holder = (SessionHolder)TransactionSynchronizationManager.getResource(sf); 
    Session s = holder.getSession(); 
    s.flush(); 
    TransactionSynchronizationManager.unbindResource(sf); 
    SessionFactoryUtils.closeSession(s); 
} 

private SessionFactory sf; 
private ApplicationContext ctx; 

然后我写的另一种方法,但这种例外再次上调!有点奇怪。我重新运行第一个测试方法,它的工作原理。但第二个没有。

第一个测试方法是这样的:

@Test 
public void testFindAll() { 
    UserGroupService userggroupService = (UserGroupService) ctx.getBean("UserGroupService"); 

    try { 
     List groups = userggroupService.findAll(); 
     System.out.println(groups); 
     if (groups != null){ 
      for (Object grp : groups){ 
       UserGroupBean group = (UserGroupBean) grp; 
       System.out.printf("id=%d, name=%s, %d members\n", group.getId(), group.getName(), group.getMembers()==null?0:group.getMembers().size()); 
       if (group.getMembers() != null){ 
        for(UserBean user: group.getMembers()){ 
         System.out.printf("\tuser-%d, %s\n", user.getUserID(), user.getName()); 
        } 
       } 
      } 
     } 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

第二个测试方法是这样的:

@Test 
public void testDeleteRel() { 
    String filename = "WebContent\\WEB-INF\\classes\\applicationContext.xml"; 
    ApplicationContext ctx = new FileSystemXmlApplicationContext(filename); 

    UserGroupService service = (UserGroupService) ctx.getBean("UserGroupService"); 


    try { 
     UserGroupBean userGroup = new UserGroupBean(); 
     userGroup.setId(1L); 
     UserGroupBean group = (UserGroupBean) service.getUserGroup(userGroup); 
     List<UserBean> members = group.getMembers(); 
     System.out.println(members.size()+" members"); 
    // members.remove(0); 
    // service.updateUserGroup(group); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

这样的PO代码:

@Entity 
@Table(name = "UserGroupBean") 
public class UserGroupBean implements UserGroup { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    private String name; 

    @ManyToMany(targetEntity = UserGroupBean.class, 
     cascade = CascadeType.REFRESH, fetch = FetchType.LAZY) 
    @JoinTable(name = "UserGroupParents", joinColumns = { @JoinColumn(name = "group_id") }, inverseJoinColumns = { @JoinColumn(name = "parent_id") }) 
    //@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
    private List<UserGroupBean> parents; 

    @ManyToMany(targetEntity = UserBean.class, 
     cascade = CascadeType.REFRESH, fetch = FetchType.LAZY) 
    @JoinTable(name = "UserGroupMembers", joinColumns = { @JoinColumn(name = "group_id") }, inverseJoinColumns = { @JoinColumn(name = "user_id") }) 
    //@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
    private List<UserBean> members; 

    // Getters and setters ... 

我的问题是:为什么相同的@Before和@After代码,但只有1个方法可以运行良好?我错过了什么?

感谢

回答

0

好,如果我的理解你的要求,你的第二个测试方法,尝试更多一次初始化应用程序上下文,虽然它在()方法之前被初始化。这不是在junit中启动spring context的有效方法。是指那些可能解决YOUT是例子: Spring JunitSpring Junit 2

+0

是的,你是对的。我犯了一个愚蠢的错误:) –

0

有关错误org.hibernate.LazyInitializationException使用

 
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true) 
@Transactional 
public class TestAnything{ 
    ... 
} 
相关问题