我正在尝试将我的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和推土机,所以有人可以建议我是否遗漏了什么?或者问题是什么?提前谢谢。
答案 0 :(得分:1)
我猜testDAO是@Transactionnal。这意味着一旦testDAO.startTest完成,交易就会关闭。
除非交易是事先启动的。在主startTest函数上放置一个@Transactionnal注释。这样,当dozer映射到DTO并且可以访问代理模型TestInfo时,事务仍然会打开。