Hibernate manny_toone erro [RESOLVIDO]

Fala galera… estou com uma pequena dificuldade na hora de inserir meu Cadastro de Clientes No banco.

Tenho a Classe Cliente… e Tenho a Classe Contato

Minha duvida… Ao clicar no gravar me aparece isso…


16957 [AWT-EventQueue-0] WARN  org.hibernate.util.JDBCExceptionReporter - SQL Error: 1048, SQLState: 23000
16958 [AWT-EventQueue-0] ERROR org.hibernate.util.JDBCExceptionReporter - Column 'id_cliente' cannot be null
org.hibernate.exception.ConstraintViolationException: could not insert: [br.com.impacta.cliente.domain.model.Contato]

Sendo que Ja tenho a logica para salvar cliente e contato ao mesmo tempo.


package br.com.impacta.cliente.app.action.cliente;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import br.com.impacta.cliente.domain.model.Cliente;
import br.com.impacta.cliente.domain.model.Contato;
import br.com.impacta.cliente.domain.model.ContatoVO;
import br.com.impacta.cliente.domain.model.Endereco;
import br.com.impacta.cliente.domain.model.EnderecoVO;

public class ClienteOkAction implements ActionListener {

	JTextField tf_nome, tf_sobrenome, tf_complemento, tf_cep;
	JComboBox<Object> jcb_sexo;

	JComboBox<Object> jcb_logradouro, jcb_bairro, jcb_municipio,
			jcb_estato_civil;
	JTextField tf_numero;

	JComboBox<Object> jcb_contato;

	JTextField tf_contato;
	JComboBox<Object> jcb_tp_endereco;

	JTable cl_table;

	SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
			.buildSessionFactory();

	public ClienteOkAction(JTextField tf_nome, JTextField tf_sobrenome,
			JTextField tf_cep, JTextField tf_complemento,
			JComboBox<Object> jcb_sexo, JComboBox<Object> jcb_logradouro,
			JComboBox<Object> jcb_bairro, JComboBox<Object> jcb_municipio,
			JComboBox<Object> jcb_estato_civil, JComboBox<Object> jcb_contato,
			JTextField tf_contato, JTextField tf_numero,
			JComboBox<Object> jcb_tp_endereco, JTable cl_table) {
		super();
		this.tf_nome = tf_nome;
		this.tf_sobrenome = tf_sobrenome;
		this.tf_complemento = tf_complemento;
		this.tf_cep = tf_cep;
		this.jcb_sexo = jcb_sexo;
		this.jcb_bairro = jcb_bairro;
		this.jcb_logradouro = jcb_logradouro;
		this.jcb_municipio = jcb_municipio;
		this.jcb_estato_civil = jcb_estato_civil;
		this.jcb_contato = jcb_contato;
		this.tf_contato = tf_contato;
		this.tf_numero = tf_numero;
		this.jcb_tp_endereco = jcb_tp_endereco;
		this.cl_table = cl_table;

	}

	@Override
	public void actionPerformed(ActionEvent arg0) {
		//Metodo para gravar No BANCO
		OkAction();

	}

	public void OkAction() {
		
		try {

			//Abre a Sessao para gravar No banco
			Session sessao = factory.openSession();
			
			
			Transaction transa = sessao.beginTransaction();

			// instancia a classe para setar Objetos a serem gravar
			int id_cliente = 0;
			
			Cliente cliente = new Cliente(id_cliente);
			
			cliente.setId_cliente(id_cliente);

			cliente.setNome(tf_nome.getText());
			cliente.setSobrenome(tf_sobrenome.getText());
			cliente.setSexo(jcb_sexo.getSelectedItem().toString());
			cliente.setEstadocivil(jcb_estato_civil.getSelectedItem()
					.toString());
			
	
			cliente.setContatos(new Contato());
			cliente.getContatos().setTipo((ContatoVO) jcb_contato.getSelectedItem());
			cliente.getContatos().setValor(tf_contato.getText());
			
			sessao.save(cliente);
			
			
		
			

				
			

			transa.commit();
			listatable();

			sessao.close();

		} catch (Exception cause) {
			cause.printStackTrace();

		}

	}

	@SuppressWarnings("unchecked")
	public void listatable() {

		DefaultTableModel model = (DefaultTableModel) cl_table.getModel();
		model.setNumRows(0);

		Session sessao = factory.openSession();

		List<Cliente> list_clientes = new ArrayList<Cliente>();

		list_clientes = (List<Cliente>) sessao.createQuery("FROM Cliente")
				.list();		
	

		int tamanho = list_clientes.size() ;

		for (int i = 0; i < tamanho; i++) {

			Cliente cliente = list_clientes.get(i);
			
			
			
			

			model.addRow(new Object[] { cliente.getId_cliente(),cliente.getNome(),
					cliente.getSobrenome(), cliente.getSexo(),
					 cliente.getContatos().getValor() });

		}

	}

}

meu hibernate.xml está configurado assim.




<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="br.com.impacta.cliente.domain.model">





	<class name="Cliente" table="cliente">
		<cache usage="read-only" />

		<id name="id_cliente" column="id_cliente" type="integer">
			<generator class="identity" />
		</id>

		<property name="nome" column="nm_cliente" type="string"></property>
		<property name="sobrenome" column="sn_cliente" type="string"></property>
		<property name="Sexo" column="id_sexo" type="string"></property>
		<property name="Estadocivil" column="id_estado_civil" type="string"></property>
		
			<many-to-one class="br.com.impacta.cliente.domain.model.Contato"  
		
		cascade="all" name="contatos"
        column="id_contato"   
        foreign-key="fk_contato"
        unique="true"
    
        />

	</class>


	<class name="Contato" table="contato">
		<cache usage="read-only" />
		<id name="id_contato" column="id_contato" type="integer">
			<generator class="identity" />

		</id>

		<property name="valor" column="vl_contato" type="string"></property>

		<property name="tipo" column="tp_contato" not-null="true">
			<type name="org.hibernate.type.EnumType">
				<param name="enumClass">br.com.impacta.cliente.domain.model.ContatoVO</param>
				<param name="">11</param>				
			</type>
			
			
		</property>
		
	
		<many-to-one class="br.com.impacta.cliente.domain.model.Cliente"  
		
		cascade="all" name="clientes"
		
        column="id_cliente"               
        foreign-key="fk_cliente"
        unique="true"
        
        
       
         />

	</class>
	
	
	



</hibernate-mapping>

Onde estou errando ??? Fico no aguardo

Quando for postar o código, poste só o que for relevante.
Onde você seta o id do cliente, seu método de salvar e como ele está mapeado seriam os mais relevantes nesse caso. Um código grande desses desmotiva os outros usuários a ajudar.

Agora as pontos relevantes:

Cliente cliente = new Cliente(id_cliente); cliente.setId_cliente(id_cliente);

-Você cria um objeto cliente passando o id e logo abaixo está passando o id de novo para o cliente? Porquê essa duplicidade?

-Outra coisa é você querer definir o id do cliente. Vai ter que ficar indo no banco toda hora para verificar pegar um numero de id e depois no código modificar o numero para obter um id válido? Quer mesmo essa dor de cabeça? Deixe isso com o banco, para isso você mapeia o id com generator do tipo increment:

<id name="id_cliente" column="id_cliente" type="integer"> <generator class="increment" /> </id>

Com esse código o banco irá gerar automaticamente um id.

-Agora se você quer mesmo setar o id na mão, comece pelo 1.

Opa… Valeu pelo retorno…

Deixei como increment…Porém sabe me dizer pq não consigo Cadastrar??

Respondendo sua outra Pergunta… nem sei pq fiz aquilo.
Não tem logica…