Inserindo valor NULL no banco com Hibernate

10 respostas
jv.nicocelli

Bom dia Senhores…

Gostaria de uma ajuda de vocês para resolver um problema que estou tendo em uma aplicação que estou fazendo.

É o seguinte, tenho uma tela para cadastro de usuário onde será possível cadastrar 2 tipos de usuários diferentes.

Possuo a entidade Usuario e suas subclasses UserTransp e UserCliente

Usuario.java

@Entity
@Table(name="users")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="tipo_user",discriminatorType = DiscriminatorType.INTEGER)
@DiscriminatorValue("0")
public class Usuario implements Serializable {

	@Id
	@GeneratedValue
	@Column(name="id")
	private int id;
	@Column(name="user_name")
	private String user_name;
	@Column(name="user_pass")
	private String user_pass;

// GETTERS E SETTERS

O método da classe DAO

public void salvar(Usuario usuario) {
		session = ConnectionFactory.getInstance();
		Transaction tx = null;
		try {
			tx = session.beginTransaction();
			session.save(usuario);
			tx.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			tx.rollback();
		} finally {
			session.close();
		}
	}

A classe usuarioBean.

public class UsuarioBean {

	private Usuario usuario = new Usuario();
	private Usuario userCliente = new UserCliente();
	private Usuario userTransp = new UserTransp();
	private DataModel model;
	InterfaceUsuarioDao idao = new UserDao();
	private int tipo_usuario;


	public String create() throws DaoException {
		// Se o tipo_usuario for 1 cadastra usuário transportadora, caso for 2
		// cadastra usuário cliente
		if (tipo_usuario == 1) {
			idao.salvar(userTransp);
		} else {
			idao.salvar(userCliente);
		}
		return "sucessoCreate";
	}

Abaixo a minha página com o formulário para cadastro.

<h:form>
				<rich:panel styleClass="#panel">
					<f:facet name="header">
						<rich:toolbar id="toolbar" styleClass="toolbar"
							itemSeparator="line">
							<rich:toolbarGroup itemSeparator="line">
								<h:commandButton action="#{usuarioBean.create}" id="save"
									image="/images/save.png">
								</h:commandButton>
								<h:commandButton immediate="true" action="cancelaCadastro"
									id="cancelar" image="/images/cancelar.png">
								</h:commandButton>

							</rich:toolbarGroup>
						</rich:toolbar>

						<h:outputText value="Cadastro de Usuário" />
					</f:facet>

					<h:panelGrid columns="3">
						<h:outputText value="E-mail" />
						<h:inputText value="#{usuarioBean.usuario.user_name}" id="login"
							required="true" label="Login" />
						<rich:messages for="login">
							<f:facet name="errorMarker">
								<h:graphicImage value="/images/error.gif" />
							</f:facet>
						</rich:messages>
						<h:outputText value="Senha" />
						<h:inputSecret value="#{usuarioBean.usuario.user_pass}" id="senha"
							required="true" label="Senha" />
						<rich:messages for="senha">
							<f:facet name="errorMarker">
								<h:graphicImage value="/images/error.gif" />
							</f:facet>
						</rich:messages>
						<h:outputText value="Tipo Usuario" />
					<h:selectOneMenu value="#{usuarioBean.tipo_usuario}"
						id="tipo_usuario" label="Tipo Usuario">
						<f:selectItem itemLabel="Selecione" />
						<f:selectItem itemLabel="Cliente" itemValue="2" />
						<f:selectItem itemLabel="Transportadora" itemValue="1" />
						</h:selectOneMenu>
					<rich:messages for="fornecedor">
						<f:facet name="errorMarker">
							<h:graphicImage value="/images/error.gif" />
						</f:facet>
					</rich:messages>
					</h:panelGrid>
				</rich:panel>
			</h:form>

O problema que está ocorrendo é o seguinte, o user_name e user_pass está gravando no banco como NULL.

Alguém sabe o que pode estar errado?

10 Respostas

JuniorMaia

quando você instancia um novo usuário (Usuario usuario = new Usuario()), sua variáveis vão zerar…

jv.nicocelli

Mais caso eu instancie dessa forma

private Usuario usuario;

Ocorre o seguinte erro ao salvar as informações do formulário:

javax.servlet.ServletException: /novoUsuario.xhtml @34,40 value="#{usuarioBean.usuario.user_name}": Target Unreachable, 'usuario' returned null
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:321)
JuniorMaia

seu usuário não está sendo criado da forma correta, indico instanciar o mesmo usando o new, e passando por parametros os dados de login e senha, aí então pelo construtor da classe que grava no banco, recebe-los e grava-los

A

Você precisa dos GETTERS E SETTERS no seu Bean.

jv.nicocelli

Tem os GETTERS E SETTERS no bean, só não coloquei o código inteiro para não ficar muito extenso.

A

Instancie as referências aos objetos dentro da classe create e faça um teste.

public String create() throws DaoException {

private Usuario usuario = new Usuario();

private Usuario userCliente = new UserCliente();

private Usuario userTransp = new UserTransp();

}
jv.nicocelli

alvespintoandre,

Não deu certo instanciando os objetos dentro do método create, inseriu NULL novamente.

O que eu percebi, se eu alterar o meu formulário para utilizar a referencia de instancia userTransp ou userCliente funciona.
Porém dessa forma eu só consigo gravar um tipo de usuário.

Ex:

<h:inputText value="#{usuarioBean.userCliente.user_name}" id="login"
							required="true" label="Login" />
						<rich:messages for="login">
A

Como estão as classes:

UserCliente e UserTransp

Poste aí…

jv.nicocelli

Por enquanto não tem nada, somente utiliza os métodos da SuperClasse e o discriminator.

UserCliente.java

@Entity
@DiscriminatorValue("2")
public class UserCliente extends Usuario {
	
	
	

	

}

UserTransp.java

@Entity
@DiscriminatorValue("1")
public class UserTransp extends Usuario {

	
	
	

}
A

Veja como inserir o discriminator: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/

O seu método salvar nunca passa um usuario, somente userTransp e userCliente

public String create() throws DaoException {   
        if (tipo_usuario == 1) {   
            idao.salvar(userTransp);   //Salvar envia um userTransp
        } else {   
            idao.salvar(userCliente);   //Salvar envia um userCliente
        }   
        return "sucessoCreate";   
    }

Veja a documentação, você poderá usar o discriminator para os seus usuarios na mesma classe.

Criado 14 de maio de 2012
Ultima resposta 14 de mai. de 2012
Respostas 10
Participantes 3