Вы должны использовать объекты передачи данных, потому что на клиентскую сторону GWT могут быть переданы только DTO.
Вы должны создать ExamDto и QuestionDto, и после получения объекта Exam из MySQL вам пришлось преобразовать его в ExamDto.
На стороне клиента вы будете работать только с DTO.Если вы хотите сохранить Exam в MySQL, вам необходимо преобразовать ExamDto в Exam.
Чтобы преобразовать POJO в DTO и обратно, вы должны использовать Dozer .
. Чтобы использовать Dozer, вынеобходимо сопоставить DTO и POJO, используя сопоставления Dozer.Я использую Пользовательские сопоставления через XML-файлы Dozer .
Лучший учебник, описывающий отношения GWT-Hibernate: Использование GWT с Hibernate
Также яСоздал конвертор класса DozerGenerator и использовал его в своих приложениях.Например, у меня есть 2 RPC - один для поиска пользователей, второй - для сохранения пользователя.
public UserDto findUserById(long id) throws IllegalArgumentException {
//userService.findUserById(long id) returns User object and than
//you need to convert it to UserDto to transfer to client.
return DozerGenerator.appUserEntityToDto(userService.findUserByID(id));
}
//here, you converts UserDto to User
public Long saveUser(UserDto userDto) throws IllegalArgumentException {
return userService.saveUser(DozerGenerator.appUserDtoToEntity(mapper, userDto));
}
А вот его класс DozerGenerator:
public class DozerGenerator {
/* User <-> UserDto */
public static User appUserDtoToEntity(DozerBeanMapper mapper, UserDto dto) {
return mapper.map(dto, User.class);
}
public static UserDto appUserEntityToDto(DozerBeanMapper mapper, User user) {
return mapper.map(user, UserDto.class);
}
public static List<UserDto> appUserListEntityToDto(DozerBeanMapper mapper, List<User> users) {
List<UserDto> models = new ArrayList<UserDto>();
for (User u : users) {
models.add(DozerGenerator.appUserEntityToDto(mapper, u));
}
return models;
}
public static List<User> appUserListDtoToEntity(DozerBeanMapper mapper, List<UserDto> dtos) {
List<User> users = new ArrayList<User>();
for (UserDto u : dtos) {
users.add(DozerGenerator.appUserDtoToEntity(mapper, u));
}
return users;
}
}
Также я использую GWT +Spring + JPA + Hibernate в моих приложениях без каких-либо специальных библиотек, таких как spring4gwt и gilead (hibernate4gwt), и он отлично работает.
Вы также можете найти информацию о вашей ошибке здесь Issue 3296