Entrada em lote 0 - ID NULL - Mapeamento OnoToOne [RESOLVIDO]

3 respostas
V

Pessoal bom dia, tarde ou noite …

Sou completamente iniciante na programação e também no Fórum. Ferramentas utilizadas para programação Eclipse e PostGres.
O meu problema ocorre quanto tento fazer uma inserção.(tela com o erro no final)
Tenho classes modelo Usuario, Pessoa, PesFisica e Funcionario. Usuario e Pessoa estão associadas 1para1 e PesFisica(herda Pessoa) e Funcionario(herda PesFisica).
Não sei se pode ser as anotações ou o código em si então estarei exibindo.
CLASSE Pessoa

@Entity
@Table(name = "pessoa")
@MappedSuperclass
public class Pessoa implements Serializable {

	private static final long serialVersionUID = 1L;

	@SequenceGenerator(sequenceName = "pessoa_id_pessoa_seq", name = "pessoa_id_pessoa_seq", initialValue = 1, allocationSize = 1)
	@GeneratedValue(generator = "pessoa_id_pessoa_seq", strategy = GenerationType.AUTO)
	@Id
	@Column(name = "id_pessoa")
	private int id_pessoa;
	@Column(name = "nome")
	private String nome;
	@Column(name = "tel_movel")
	private float tel_movel;
	@Column(name = "tel_fixo")
	private float tel_fixo;
	@Column(name = "tel_comercial")
	private float tel_comercial;
	@Column(name = "sexo")
	private String sexo;

	@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	@JoinColumn(name = "id_usuario", referencedColumnName = "id_usuario", insertable = true, updatable = true)
	private Usuario usuario;

	public Pessoa() {
		super();
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	//Todos os get e set dos atributos id_pessoa, nome, tel_movel, tel_fixo, tel_comercial, sexo e usuario.

}

CLASSE Usuario

@Entity
@Table(name = "usuario")
public class Usuario implements Serializable {

	private static final long serialVersionUID = 1L;

	@SequenceGenerator(sequenceName = "usuario_id_usuario_seq", name = "usuario_id_usuario_seq", initialValue = 1, allocationSize = 1)
	@GeneratedValue(generator = "usuario_id_usuario_seq", strategy = GenerationType.AUTO)
	@Id
	@Column(name = "id_usuario")
	private int id_usuario;
	@Column(name = "email")
	private String email;
	@Column(name = "senha")
	private String senha;
	@Column(name = "tp_usuario")
	private String tp_usuario;

	@OneToOne(mappedBy = "usuario", targetEntity = Pessoa.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	private Pessoa pessoa;

	public Usuario() {
		super();
	}

	public static long getSerialversionuid() {
		return serialVersionUID;

         //Todos os get e set dos atributos id_usuario, email, senha, tp_usuario e pessoa.

	}

Não colocarei o código das classes modelos PesFisica e Funcionario pois são heranças o problema esta mesmo na associação.(se quizerem só pedir)
E então na CLASSE FuncionarioControle

if (action.equals("AdicionarFuncionario")) {
			
			List<Funcionario> lista;
			
			Funcionario func = new Funcionario();
			FuncionarioDAO funcDAO = FuncionarioDAO.getInstance();
			
			Usuario usua = new Usuario();	
			UsuarioDAO usuaDAO = UsuarioDAO.getInstance();
			
			//pessoa
			func.setNome(request.getParameter("nome"));
			func.setTel_movel(Float.parseFloat(request.getParameter("tel_movel")));
			func.setTel_fixo(Float.parseFloat(request.getParameter("tel_fixo")));
			func.setTel_comercial(Float.parseFloat(request.getParameter("tel_comercial")));
			func.setSexo(request.getParameter("sexo"));
			//pessoa fisica
			func.setCpf(Integer.parseInt(request.getParameter("cpf")));
			func.setDt_nascimento(Date.valueOf(request.getParameter("dt_nascimento")));
			//funcionario
			func.setEndereco(request.getParameter("endereco"));
			func.setNumero(request.getParameter("numero"));
			func.setBairro(request.getParameter("bairro"));
			func.setCep(request.getParameter("cep"));
			func.setCargo(request.getParameter("cargo"));
			//usuario
			usua.setEmail(request.getParameter("email"));
			usua.setSenha(request.getParameter("senha"));
			usua.setTp_usuario(request.getParameter("tp_usuario"));
			
			usua.setPessoa(func);
			usuaDAO.save(usua);
			funcDAO.save(func);
			
			//lista de funcionario
			lista = FuncionarioDAO.getInstance().listar();

			// gravar no request com o nome "LISTA_FUNC"
			if (lista != null)
				request.setAttribute("LISTA_FUNC", lista);
			RequestDispatcher rd = request.getRequestDispatcher("home.html");
			rd.forward(request, response);
              }

Ao clicar Cadastrar(submit) os dados por uma html simples exibe o erro no console:

Hibernate: select nextval ('usuario_id_usuario_seq')
Hibernate: select nextval ('pessoa_id_pessoa_seq')
Hibernate: insert into usuario (email, senha, tp_usuario, id_usuario) values (?, ?, ?, ?)
Hibernate: insert into pessoa (nome, sexo, tel_comercial, tel_fixo, tel_movel, id_usuario, id_pessoa) values (?, ?, ?, ?, ?, ?, ?)
2012-05-13 09:11:01,939 (JDBCExceptionReporter.java:100)  WARN - SQL Error: 0, SQLState: 23502
2012-05-13 09:11:01,940 (JDBCExceptionReporter.java:101) ERROR - Entrada em lote 0 insert into pessoa (nome, sexo, tel_comercial, tel_fixo, tel_movel, id_usuario, id_pessoa) values ('Vinicius', 'Masculino', '112.0', '314.0', '516.0', NULL, '31') foi abortada. Chame getNextException para ver a causa.
2012-05-13 09:11:01,940 (JDBCExceptionReporter.java:100)  WARN - SQL Error: 0, SQLState: 23502
2012-05-13 09:11:01,940 (JDBCExceptionReporter.java:101) ERROR - ERRO: valor nulo na coluna "id_usuario" viola a restrição não-nula
2012-05-13 09:11:01,941 (AbstractFlushingEventListener.java:324) ERROR - Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update

Já não sei mais o que fazer para testar e resolver o problema, eu não entendo o porque do id_funcionario fica NULL. Será que é porque estou utilizando 2 save no FuncionarioControle “usuaDAO.save(usua); funcDAO.save(func);”? Será a notaçao que esta errada? Ou o código?

Bom são muitas dúvidas, se alguem puder ajudar na solução ou onde está o erro eu agradeço muito.
Acredito que tenha mostrado todos os detalhes, mas se alguem quizer saber mais pode falar…

Abraço e obrigado a todos.

3 Respostas

A

cara,

como sua relacao é bidirecional, vc precisa fazer o seguinte

usua.setPessoa(func);  
func.setUsuario(usua);

funcDAO.save(func);

t+

V

Obrigado vlw mesmo…

Testei aqui e foi.

A

cara,
marca o post como resolvido

flw

Criado 13 de maio de 2012
Ultima resposta 13 de mai. de 2012
Respostas 3
Participantes 2