Столкнулся с непонятной для меня проблемой: когда я пытаюсь добавить роль пользователя, система переходит в рефлексию и выдает исключение NullPointerException вместо того, чтобы брать значение роли из DAO.
Организация:
@Entity
@Table(name = "users")
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "email", unique = true, nullable = false)
private String email;
@Column(name = "password", nullable = false)
private String password;
@Column(name = "first_name", length = 50, nullable = false)
private String firstName;
@Column(name = "last_name", length = 50, nullable = false)
private String lastName;
@Temporal(TemporalType.DATE)
@DateTimeFormat(pattern = "yyyy-MM-dd")
@Column(name = "birth_date", nullable = false)
private Date birthDate;
@ManyToOne
@JoinColumn(name = "role")
private Role role;
// getter & setter
и
@Entity
@Table(name = "roles")
public class Role implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name;
@OneToMany(mappedBy = "role")
private Set<User> users;
// getter & setter
DAO (роль):
@Repository
public class RoleDaoImpl extends AbstractGenericDao<Role> implements RoleDao {
private static final Logger LOG = Logger.getLogger(RoleDaoImpl.class.getName());
private static final String GET_ROLE_BY_NAME = "SELECT r FROM Role r WHERE r.name = :name";
@Override
public Role getRoleByName(String name) {
Query query = getCurrentSession().createQuery(GET_ROLE_BY_NAME);
query.setParameter("name", name);
Role role = null;
try {
role = (Role) query.getSingleResult();
} catch (Exception e) {
LOG.warn(e);
}
return role;
}
}
Теперь я пытаюсь преобразовать свое userDto (оно повторяет сущности, но не содержит id и роль). Все работает, пока я не попытаюсь добавить user.addRole:
public static User constructUser(UserDto userDto) {
User user = new User();
user.setEmail(userDto.getEmail());
user.setPassword(userDto.getPassword());
user.setFirstName(userDto.getFirstName());
user.setLastName(userDto.getLastName());
user.setBirthDate(DateConverter.convertDate(userDto.getBirthDate()));
//user.setRole(roleDao.getRoleByName("ROLE_USER"));
return user;
}
Как только дело доходит до закомментированной строки, компилятор не входит в DAO, он входит в рефлексию и пытается что-то там сделать и возвращает NullPointer.
Расскажите неопытному, в чем может быть дело и как это исправить. У всего этого болит голова.
Таблицы существуют, значения действительны. Без DTO (через сущность) все работает нормально.