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.