2013-09-11 5 views
1

Я пытаюсь сопоставить мой POJO с DTO. У меня нет настраиваемых полевых карт, поскольку все мои поля в моем DTO такие же, как и в моем POJO. Но мой POJO имеет несколько уровней отображения. Моя проблема в том, что когда я пытаюсь скопировать содержимое моего POJO в DTO, я получаю LazyInitializationException. Вот код, в котором генерируется исключение.Dozer throwing 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; 
} 

Это мое ПОЯ.

@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 имеет коллекцию другого класса, который в свою очередь, имеет набор вопросов, и каждый вопрос имеет набор ответов. Все они отображаются с использованием аннотаций JPA.

Я проверил содержимое объекта «info», которое я получаю от DAO, и все присутствует. Но когда я пытаюсь скопировать его в объект DTO (объект infoDTO), возникает LazyInitializationException. Это первый раз, когда я использую DTO и Dozer, поэтому кто-нибудь может предположить, что я что-то упустил? Или в чем проблема? Заранее спасибо.

ответ

1

Я думаю, что testDAO является @Transactionnal. Это означает, что как только testDAO.startTest закончит, транзакция будет закрыта.

То есть, если транзакция не началась раньше. Поместите аннотацию @Transactionnal в свою основную функцию startTest. Таким образом, транзакция по-прежнему будет открыта, когда бульдозер будет сопоставлен с DTO, и доступ к прокси-модели TestInfo будет возможен.

Смежные вопросы