推土机抛出lazyInitializationException

时间:2013-09-11 09:30:19

标签: hibernate dozer lazy-initialization

我正在尝试将我的POJO映射到DTO。我没有任何自定义字段映射器,因为我的DTO中的所有字段都与我的POJO中的字段相同。但我的POJO涉及多层次的映射。我的问题是当我试图将我的POJO的内容复制到DTO时,我得到了LazyInitializationException。这是抛出异常的代码。

public TestInfoDTO startTest(long testId)
{
    TestInfo info = testDAO.startTest(testId);

    Mapper mapper = new DozerBeanMapper();
    try
    {
        // Exception thrown here.
        infoDTO = mapper.map(info, TestInfoDTO.class);

    } catch(Exception e) {
        LOGGER.info("Exception Thrown While Mapping POJO to DTO");
        e.printStackTrace();
    }
    return infoDTO;
}

这是我的POJO。

@Entity
@Table(name = "TEST_INFO")
public class TestInfo implements Serializable,IAuditLog
{
private static final long serialVersionUID = 1L;

private long test_ID;
private String test_name;
private Date creation_date;
private String instructions;
private TestPaperInfo testPaperInfo;
private List<TestResults> testResults;
private List<TestResponse> testResponses;
private List<TestUtility> testUtility;

//Getters and setters with hibernate annotations.
}

这是我的DTO

public class TestInfoDTO 
{
private long test_ID;
private String test_name;
private Date creation_date;
private String instructions;
private TestPaperInfo testPaperInfo;
private List<TestResults> testResults;
private List<TestResponse> testResponses;
private List<TestUtility> testUtility;

//Getters and Setters.
}

在上面的POJO中,TestPaperInfo有另一个类的Collection,后者又有一组问题,每个问题都有一个Answers集合。它们都使用JPA注释进行映射。

我已经检查了我从DAO获得的“info”对象的内容,一切都存在。但是当我试图将它复制到DTO(“infoDTO”对象)时,抛出了LazyInitializationException。 这是我第一次使用DTO和推土机,所以有人可以建议我是否遗漏了什么?或者问题是什么?提前谢谢。

1 个答案:

答案 0 :(得分:1)

我猜testDAO是@Transactionnal。这意味着一旦testDAO.startTest完成,交易就会关闭。

除非交易是事先启动的。在主startTest函数上放置一个@Transactionnal注释。这样,当dozer映射到DTO并且可以访问代理模型TestInfo时,事务仍然会打开。