Inserção em várias tabelas

Eu to quebrando a cabeça com isso aqui, é o seguinte:

Tenho um formulário que vai cadastrar um parceiro. Mas esse parceiro é também um Funcionário, então tem que cadastrar um registro com o id dele na tab_func (tabela de funcionários) e um na tab_clap (Tabela de classificações de parceiro). E isso tudo tem que ser ao mesmo tempo.

Estrutura da tab_clap:

filparc character varying(255) NOT NULL, //Filial do parceiro claparc character varying(255), //Classificação do parceiro (08 é funcionário, 00 é cliente, 01 é fornecedor, etc.) codparc integer, //Código do Parceiro CONSTRAINT tab_clap_pkey PRIMARY KEY (filparc)

A tab_func é bem parecida, a exceção é que a chave codparc é estrangeira. A tab_parc tem o campo codparc que todos devem referenciar.

Como eu faço pra cadastrar os três, sendo que a tab_func e tab_clap tem que ter o id da tab_parc que ta sendo cadastrada na hora? Teria que cadastrar o parceiro pra depois fazer uma busca por ele e só depois cadastrar a classificação e funcionário?

Se voce estiver usando hibernate da uma pesquisada sobre Cascade

Sim, eu estou usando o Hibernate.

O cascade do qual você se refere é a propriedade “cascade = CascadeType.ALL” que põe nas annotations @ManyToOne, ManyToMany, etc.?

Para usa-las eu não teria que inserir primeiro a classe que faz referência?

Olá, não sei como você está codificando os seus inserts, mais eu encontrei uma forma que derrepente pode te ajudar. veja se por sql dá certo ai no seu projeto.

#Inseri na primeira tablea
INSERT INTO `pessoas` (`nome`) VALUES ('tiago');
#armazena o ultimo id em uma variavel
SET @idpessoa = LAST_INSERT_ID();
#insere a informação com o id que vc precisava
INSERT INTO `funcionario` (`id_pess`, `funcao`) VALUES (@idpessoa , 't.i');

Abrasss

Leia os artigos http://uaihebert.com/, tem muito exemplo pra isso la mano, agora to de saida ‘-’…boa sorte =D

TiagoAndroid Essa forma eu não conhecia, muito interessante por sinal, mas isso é com SQL, e eu não sei fazer isso usando o Hibernate.

rof20004 Eu ja tinha procurado no blog do Hebert mas não tinha encontrado nada a respeito, se vc souber de alguma outra fonte seria bom, no mais, obrigado pela ajuda.

Cara não sei se entendi direito… mas eu uso o método assim para fazer insert em várias tabelas ao mesmo tempo, tem algumas verificações nos campos que vem como parâmetros, mas da para entender…

[code]

// INSERE NO PLANO
private static final String SQL_SIMCARD_INSERE_PLANO = “INSERT INTO plano(Nome)”
+ “VALUES((?::varchar))”;
// INSERE NA LINHA
private static final String SQL_SIMCARD_INSERE_LINHA = “INSERT INTO linha(Numero, CodigoPlano, CodigoStatusLinha, NumeroConta, DataAtivacao, DataAlteracao, MatriculaAlteracao)”
+ “VALUES((?::varchar)::numeric, (?::varchar)::integer, (?::integer),(?::varchar),(?::date),?,(?::varchar))”;
// INSERE NA SIMCARD
private static final String SQL_SIMCARD_INSERE_SIMCARD = “INSERT INTO SIMCard (Numero, CodigoProcessamento, NumeroLinha, CodigoStatusSIMCard, CodigoAPNProvisionada, CodigoOperadora, IMSI, ConsumoDados, DataAlteracao, MatriculaAlteracao)”
+ “VALUES((?::varchar)::numeric, (?::integer), (?::varchar)::numeric, (?::integer), (?::integer), (?::integer), (?::varchar)::numeric, (?::varchar), ?, (?::varchar))”;

// FAZ O INSERT NA CONTA, PLANO, LINHA E SIMCARD
public boolean simCardInsereTelecom(String simCard, String linha,
int apnUtilizada, String conta, int operadora, String plano,
int statusSIMCard, Date dtAtivacao, int fonte, int statusLinha,
String imsi, String consumoDados, String nomeArq, int codigoProc,
String login, Calendar horaAtual) {

	boolean insere = false;
	boolean existe = false;
	Connection conn = null;

	PreparedStatement pl = null;
	PreparedStatement li = null;
	PreparedStatement sc = null;

	try {
		conn = ConnectionManager.obterConexao();
		pl = conn.prepareStatement(SQL_SIMCARD_EXISTE_PLANO);
		if (plano == null || plano == "") {
			plano = "0";
			pl.setString(1, plano);
		} else {
			pl.setString(1, plano);
		}
		existe = pl.executeQuery().next();
		if (!existe) {
			pl = conn.prepareStatement(SQL_SIMCARD_INSERE_PLANO);
			if (plano == null || plano == "") {
				plano = "0";
				pl.setString(1, plano);
			} else {
				pl.setString(1, plano);
			}
			pl.executeUpdate();
		} 

		li = conn.prepareStatement(SQL_SIMCARD_EXISTE_LINHA);
		li.setString(1, linha);
		existe = li.executeQuery().next();
		if (!existe) {
			li = conn.prepareStatement(SQL_SIMCARD_INSERE_LINHA);
			li.setString(1, linha);
			li.setString(2, CodigoPlano(plano));
			li.setInt(3, statusLinha);
			if (conta == null || conta == "") {
				conta = "0";
				li.setString(4, conta);
			} else {
				li.setString(4, conta);
			}
			if (dtAtivacao != null){
				li.setDate(5, new java.sql.Date((dtAtivacao).getTime()));
			} else {
				li.setDate(5, null);	
			}
			li.setTimestamp(6,
					new java.sql.Timestamp(horaAtual.getTimeInMillis()));
			li.setString(7, login);
			li.executeUpdate();
		}

		sc = conn.prepareStatement(SQL_SIMCARD_INSERE_SIMCARD);
		sc.setString(1, simCard);
		sc.setInt(2, codigoProc);
		sc.setString(3, linha);
		sc.setInt(4, statusSIMCard);
		sc.setInt(5, apnUtilizada);
		sc.setInt(6, operadora);
		if (imsi == null || imsi == "") {
			imsi = "0";
			sc.setString(7, imsi);
		} else {
			sc.setString(7, imsi);
		}
		if (consumoDados == null || consumoDados == "") {
			consumoDados = "0";
			sc.setString(8, consumoDados);
		} else {
			sc.setString(8, consumoDados);
		}
		sc.setTimestamp(9,
				new java.sql.Timestamp(horaAtual.getTimeInMillis()));
		sc.setString(10, login);
		sc.executeUpdate();

	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		ConnectionManager.fecharConexao(conn, null, pl);
		ConnectionManager.fecharConexao(conn, null, li);
		ConnectionManager.fecharConexao(conn, null, sc);
	}

	return insere;
}[/code]