有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案