[Resolvido]Persistência Hibernate + Struts + Combobox

Galera, já sei qual é o problema porém não sei exatamente como resolvê-lo, pesquisando encontrei situações semelhantes porém das resoluções que achei nenhuma me satisfez, me perdoem desde já caso eu diga alguma besteira :lol: então vamos lá:

tenho 2 classes, NivelUsuario e Usuario, seguem as mesmas abaixo:

NivelUsuario.java

@Entity(name="NivelUsuarioBean")
@Table(name="tabNivelUsuario")
public class NivelUsuario extends ValidatorForm {
	private static final long serialVersionUID = 2345678;
	private String nome,descricao;
	private long id;

	public NivelUsuario() {
	}

	@Id
	@GeneratedValue
	@Column(name="idNivelUsuario")
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}

	@Column(name="strNome", nullable = false, unique = true, length = 50)
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}

	@Column(name="strDescricao", nullable = true, length = 500)
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	@Override
	public String toString() {
		return id + " | " + nome + " | " + descricao;
	}
}

Usuario.java

@Entity(name="UsuarioBean")
@Table(name="tabUsuario")
public class Usuario extends ValidatorForm {
	private static final long serialVersionUID = 2345678;
	private String usuario,senha,email;
	private long id;
	private NivelUsuario nivelUsuario;

	public Usuario() {
	}
	public Usuario(String usuario, String senha, String email) {
		this.usuario = usuario;
		this.senha = senha;
		this.email = email;
	}
	public Usuario(long id, String usuario, String senha, String email) {
		this.id = id;
		this.usuario = usuario;
		this.senha = senha;
		this.email = email;
	}

	@Id
	@GeneratedValue
	@Column(name="intIdUsuario")
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}

	@Column(name="strUsuario", nullable = false, unique = true)
	public String getUsuario() {
		return usuario;
	}
	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}
	
	@Column(name="strSenha", nullable = false)
	public String getSenha() {
		return senha;
	}
	public void setSenha(String senha) {
		this.senha = senha;
	}

	@Column(name="strEmail", nullable = false)
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}

	@ManyToOne(cascade = CascadeType.ALL)
	public NivelUsuario getNivelUsuario() {
		return nivelUsuario;
	}

	public void setNivelUsuario(NivelUsuario nivelUsuario) {
		this.nivelUsuario = nivelUsuario;
	}

	@Override
	public String toString() {
		return id + " | " + usuario + " | " + senha + " | " + email;
	}
}

Eis a minha dúvida, o CRUD funciona perfeitamente na classe NivelUsuario, o problema é que, ao tentar persistir um registro da classe Usuario, ela tem um relacionamento do tipo N:1 com a classe NivelUsuario, o struts ao tentar instanciar o ActionForm causa type mismatch pois listo os niveis de usuário por uma combobox e jogo o id dos mesmos no value da mesma, como podem ver logo abaixo:

<html:select property="nivelUsuario" value="${atual.nivelUsuario}" errorStyleClass="erroHighlight"
	errorKey="org.apache.struts.action.ERROR" styleClass="validate[required]" styleId="nivelUsuario">
	<html:option value="">Selecionar</html:option>
	<html:options collection="listaNiveisUsuario" property="id" labelProperty="nome"/>
</html:select>

então a pergunta é a seguinte, como fazer para de uma combobox, o struts inserir um objeto dentro de outro?
pensei em encapsular tal ação alterando o getter e o setter de NivelUsuario dentro da classe Usuario mas a idéia não está bem formulada na minha cabeça ainda, pois não faz muito sentido(pelo menos do jeito que pensei), “enganar” o struts passando um int para o setter(e pelo get do hibernate ele encontra e instancia o NivelUsuario), e retornando o id do usuário pelo getter sendo que precisarei novamente do objeto em si, repitindo, perdão se falei alguma besteira pois estou aprendendo, agradeço desde já!

OBS: editarei o post assim que encontrar a solução.

Bom como prometido postarei a solução que encontrei para esse “quebra-cabeças” rsrs

O jeito que encontrei foi o seguinte, se é o melhor eu não sei, mas não encontrei outra maneira por enquanto!

Na classe Usuario.java, pode ser no construtor ou direto no atributo, eu instancio um objeto automaticamente como podem ver logo abaixo:

public class Usuario extends ValidatorForm {
	private static final long serialVersionUID = 2345678;
	private String usuario,senha,email;
	private long id;
	private NivelUsuario nivelUsuario = new NivelUsuario();  //AO INSTANCIAR A CLASSE USUARIO AUTOMATICAMENTE EU CRIO UMA INSTANCIA DA CLASSE NIVEL USUARIO

	public Usuario() {
	}

após isso na minha jsp eu alterei minha combobox, e dei um nome fictício para a property do combobox, no caso idNivelUsuario como podem ver:

<html:select name="UsuarioBean" property="idNivelUsuario" value="${atual.nivelUsuario.id}" errorStyleClass="erroHighlight"
	errorKey="org.apache.struts.action.ERROR" styleClass="validate[required]" styleId="idNivelUsuario">
	<html:option value="">Selecionar</html:option>
	<html:options collection="listaNiveisUsuario" property="id" labelProperty="nome"/>
</html:select><br />

na minha action, atraves do método request.getParameter() consegui pegar o valor da combo e setei manualmente o objeto adicionando as seguintes linhas na action:

//DEFINE NIVEL DE USUARIO
long idNivelUsuario = Long.parseLong(request.getParameter("idNivelUsuario"));
usuario.setNivelUsuario(new NivelUsuarioDAO().get(idNivelUsuario));

após isso é só persistir o objeto pelo hibernate tranquilamente, espero ajudar alguém porque quebrei um pouco a cabeça nessa :lol: