java当@PersistenceContext被创建时?
我使用spring 4.3.1和hibernate 4.3.11。 我对hibernate延迟加载有问题。 我有两个例子 第一个很好
@Test
@Transactional
public void lazy1() {
List<WorkActivity> list = workActivityFacade.findAll();
list.stream().forEach(wa -> wa.getWorkActivityTelephonyStatusMappings().size());
}
第二种方法在org上失败。冬眠LazyInitializationException:未能延迟初始化role:WorkActivity的集合。WorkActivityTelephonyStatus映射,无法初始化代理-无会话
@Test
public void lazy2() {
test();
}
@Transactional
public void test() {
List<WorkActivity> list = workActivityFacade.findAll();
list.stream().forEach(wa -> wa.getWorkActivityTelephonyStatusMappings().size());
}
我的问题是——为什么? 据我所知,如果在同一个会话中,或者更一般地,在一个持久性上下文中读取并运行延迟加载,那么延迟加载将起作用。 WorkActivityFacade是ejb有状态bean,它用事务持久性上下文包装实体管理器。为什么在第一种情况下,事务上下文是在方法启动时创建的,并在方法运行期间存在,而在第二种情况下,它只在bean中创建
UPD1-我的测试类的完整代码
@RunWith(SpringInstanceTestClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class WorkActivityFacadeTest {
@Autowired
private WorkActivityFacade workActivityFacade;
@Autowired
private TelephonyStatusFacade telephonyStatusFacade;
@Autowired
private WorkActivityTelephonyStatusMappingFacade mappingFacade;
Random r = new Random();
private static TelephonyStatus telephonyStatus;
@Before
public void setUp() {
telephonyStatus = telephonyStatusFacade.create(new TelephonyStatus("test", Color.CYAN, "s" + r.nextDouble()));
}
@After
public void tearDown() {
//telephonyStatusFacade.remove(telephonyStatus);
}
protected WorkActivity initializeEntity() {
WorkActivity wa = new WorkActivity(Color.CYAN, "test activity", true, false, false);
//wa.setTelephonyStatusList(Collections.singletonList(telephonyStatus));
return wa;
}
@Test
public void lazy() {
WorkActivity created = workActivityFacade.create(initializeEntity());
mappingFacade.create(new WorkActivityTelephonyStatusMapping(created, telephonyStatus));
}
@Test
@Transactional
public void lazy1() {
List<WorkActivity> list = workActivityFacade.findAll();
list.stream().forEach(wa -> wa.getWorkActivityTelephonyStatusMappings().size());
}
@Test
public void lazy2() {
test();
}
@Transactional
public void test() {
List<WorkActivity> list = workActivityFacade.findAll();
list.stream().forEach(wa -> wa.getWorkActivityTelephonyStatusMappings().size());
}
}
共 (0) 个答案