CSmith
@CSmith
Студент.

Как избавиться от TypeMismatchException (String->Long)?

Всем привет,
Есть значит у меня тест
@Test
    public void FindExists() throws Exception {
        assertNotNull(userService.findById(1L));
    }

1L - единица под видом Long'а. Верно ведь?
findById() выглядит так
public User findById(Long id) {
        return userRepository.findOne(id);
    }

Вопрос: Почему Java на меня кричит что ей необходим ... String?!
org.hibernate.TypeMismatchException: Provided id of the wrong type for class cards.server.entity.User. Expected: class java.lang.String, got class java.lang.Long

Спасибо

Update: полный "жизненный цикл переменной id
В POJO Users.java
@GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    private Long id;

В репозиториях.BaseRepository.java
@NoRepositoryBean
public interface BaseRepository<T, Long extends Serializable> extends Repository<T, Long> {
    void delete(T deleted);
    List<T> findAll();
    T findOne(Long id);
    T save(T persisted);
}

Его наследник - UserRepository.java
@Repository
public interface UserRepository extends BaseRepository<User, Long> {
    List<User> findByUsernameLike(String username);
    User findByUsername(String username);
    List<User> findByEnabledTrue();
    List<User> findByEnabledFalse();
    void deleteByUsername(String username);
}

Теперь сервисы. BaseService.java
public interface BaseService<T> {
    T add(T item);
    T update(Long id, T data);
    void delete(Long id);
    T findById(Long id);
    List<T> findAll();
}

Его наследник - UserService.java
@Service
public class UserService implements BaseService<User> {

    @Resource
    private UserRepository userRepository;
    public User add(User item) {
        return userRepository.save(item);
    }
    public User update(Long id, User data) {
        User user = findById(id);
        user.setUsername(data.getUsername());
        user.setDetails(data.getDetails());
        user.setEnabled(user.getEnabled());
        user.setPassword(data.getPassword());
        user.setRole(data.getRole());
        user.setPacks(data.getPacks());
        return user;
    }
    public void delete(Long id) {
        userRepository.delete(userRepository.findOne(id));
    }
    public User findById(Long id) {
        return userRepository.findOne(id);
    }
    public List<User> findByUsernameLike(String username) {
        return userRepository.findByUsernameLike(username);
    }
    public User findByUsername(String username) {
        return userRepository.findByUsername(username);
    }
    public List<User> findAll() {
        return userRepository.findAll();
    }
}

Ну, и сам тест UserRepository
@Resource
    private UserService userService;
    // some code
    @Test(expected = NullPointerException.class)
    public void FindDoesntExists() throws Exception {
        assertNull(userService.findById(1000L));
    }

Структура проекта
QD2nJ9s.png
  • Вопрос задан
  • 1336 просмотров
Пригласить эксперта
Ответы на вопрос 1
zolt85
@zolt85
Программист
Тут hibrnate вам как бы намекает, что id сущности User объявлен как String.
Либо меняйте тип id на Long, либо (костыльный быстрый вариант) делайте
public User findById(Long id) {
        return userRepository.findOne(Long.toString(id));
    }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы