Galera estou com um problema, como eu faço para persistir um dado utilizando Hibernate e fazer com que ele me retorne o id do objeto que foi persistido?
Vlw abraços
Galera estou com um problema, como eu faço para persistir um dado utilizando Hibernate e fazer com que ele me retorne o id do objeto que foi persistido?
Vlw abraços
Posso estar errado mas eu acho que depois que o objeto é persistido o ID é atribuído e vc pode retorná-lo. Tipo:
return objeto.getId();
É isso mesmo se o objeto é persistido com sucesso, o mesmo é retornado, ai fica fácil só pegar a propriedade que vc quer e retornar…
object = EntityManager.persist(object);
return objecto.getNomedoCampo();
Só completando o que o Ginhu disse, não precisa exatamente atribuir o valor a outro objeto, um simples
em.persist(objeto);
return objeto.getId();
Já resolve. (isso usando a especificação JPA, porque no Hibernate ao invés de persist é save())
Vlw ae galera era isso mesmo, agora estou com outro caso onde eu tenho que persistir um objeto em uma tabela, e pegar esse objeto persistido e persistir em outra.
Alguém sabe se isso é possivel sendo que eu estou na mesma sessão ou se tem como eu forçar um commit?
Vlw…
Como assim persistir em outra?
Seria um relacionamento entre dois objetos?
Eu tenho uma regra que quando eu persisto um Objeto na tabela A eu tenho que relacionar ele com outro dado de uma tabela B…
Ou seja quando eu persisto ele eu obtenho o seu id e tento fazer uma outra persistencia na tabela B utilizando o id dele para fazer o relacionamento, porém está me dando um erro de FK, creio que seja por que ainda não foi feito realmente a persistencia, ou não seia o caso?
Coloca o erro que dá aqui…
36:01,264 TRACE org.hibernate.type.LongType - binding '1542' to parameter: 4
12:36:01,279 WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 2291, SQLState: 23000
12:36:01,295 ERROR org.hibernate.util.JDBCExceptionReporter - ORA-02291: integrity constraint (ORGANOGRAMA.NIVELHIERARQUIAFK1) violated - parent key not found
12:36:01,295 WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 2291, SQLState: 23000
12:36:01,295 ERROR org.hibernate.util.JDBCExceptionReporter - ORA-02291: integrity constraint (ORGANOGRAMA.NIVELHIERARQUIAFK1) violated - parent key not found
12:36:01,295 ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
é esse o erro que está surgindo, OK.
Vlw
nandoccp,
neste caso vc não vai pegar o ID do objeto que foi persistido promeiro e setar como chave estrangeira no outro objeto.
O que você tem que fazer seria mais ou menos assim:
class Funcionario{
int id;
String nome;
// Relacionamento
Departamento departamento;
/*
* getters and setters omitidos
*/
}
class Departamento{
int id;
String nome;
// Relacionamento
Funcionario funcionario;
/*
* getters and setters
*/
}
class Persiste{
public static void main(String[] args) {
Departamento d = new Departamento();
d.setNome("Marketing");
Funcionario f = new Funcionario();
f.setNome("Manel");
// Aqui está a jogada
f.setDepartamento(d);
/* E quando você mandar persistir o funcionario,
automaticamente o hibernate irá persistit tb o departamento
e irá atribuir as chaves estrangeiras pra vc
*/
}
}
Lógico que tem que estar configurado com anotações ou com .xml os relacionamentos entre as entidades.
Ah, qual versão do hibernate vc esta utilizando?
Eu tenho uma regra que quando eu persisto um Objeto na tabela A eu tenho que relacionar ele com outro dado de uma tabela B…
Ou seja quando eu persisto ele eu obtenho o seu id e tento fazer uma outra persistencia na tabela B utilizando o id dele para fazer o relacionamento, porém está me dando um erro de FK, creio que seja por que ainda não foi feito realmente a persistencia, ou não seia o caso?
Se você usar corretamente os many-to-* ou one-to-* e usar o cascade, não será necessário fazer essa volta toda de salvar um e pegar PK e setar na outra… nada disso é necessário.
Veja os exemplos no site do Hib sobre relacionamentos.
Eu utilizo Hibernate 3 porém o que me quebra as pernas é que utilizo Java 1.4 aqui.
Bom no meu xml está mapeado da seguinte forma.
<class name="organograma.Nivel" table="NIVEL" schema="ORGANOGRAMA">
<id name="idnivel" type="java.lang.Long">
<column name="IDNIVEL" precision="22" scale="0" />
<generator class="sequence">
<param name="sequence">ORGANOGRAMA.NIVELSQ</param>
</generator>
</id>
<set name="nivelhierarquiasForIdnivel" inverse="true">
<key>
<column name="IDNIVEL" precision="22" scale="0" not-null="true" />
</key>
<one-to-many class="organograma.Nivelhierarquia" />
</set>
<set name="nivelhierarquiasForIdnivelpai" inverse="true">
<key>
<column name="IDNIVELPAI" precision="22" scale="0" not-null="true" />
</key>
<one-to-many class="organograma.Nivelhierarquia" />
</set>
</class>
O mapeamento que possuo é similar ao que está acima, este relacionamento ele é hierarquico.
Esqui de colocar a outra ponta do relacionamento, segue abaixo.
<class name="organograma.Nivelhierarquia" table="NIVELHIERARQUIA" schema="ORGANOGRAMA">
<id name="idnivel" type="java.lang.Long">
<column name="IDNIVEL" precision="22" scale="0" />
<generator class="sequence">
<param name="sequence">ORGANOGRAMA.NIVELHIERARQUIASQ</param>
</generator>
</id>
<many-to-one name="nivelByIdnivel" class="organograma.Nivel" update="false" insert="false" fetch="select">
<column name="IDNIVEL" precision="22" scale="0" not-null="true" />
</many-to-one>
<many-to-one name="nivelByIdnivelpai" class="organograma.Nivel" fetch="select">
<column name="IDNIVELPAI" precision="22" scale="0" not-null="true" />
</many-to-one>
</class>
Esse é o mapeamento da outra ponta do relacionamento.
nandoccp, o erro por um lado pode ser que você tem o idnivel duplicado, então por isso o campo nivelByIdnivel está com insertable e updatable false. O ideal é você usar chaves compostas neles. http://www.hibernate.org/hib_docs/v3/reference/en-US/html/mapping.html#mapping-declaration-compositeid
No <many-to-one> adicione o cascade=all onde você achar que ele deve salvar em cascata. Porém cuidado para não colocar em tudo, senão você pode fazer uma bagunça grande, hehe. Os valores de cascade podem ser também delete-orphan, save-update… e mais alguns que não lembro de cabeça.
Uma sugestão: melhore o nome desses atributos. É confuso ver nivelByIdnivel quando ele poderia ser simplesmente nível. Ou algo mais intuitivo.
Abs
Galera descobri aonde estava o problema ele está no mapeamento acima, pois na realidade o meu id da tabela nivelhierarquia não era gerado por uma sequence e sim pelo idNivel.
Segue abaixo um melhoramento do mapeamento.
<class name="organograma.Nivelhierarquia" table="NIVELHIERARQUIA" schema="ORGANOGRAMA">
<id name="idnivel" type="java.lang.Long">
<column name="IDNIVEL" precision="22" scale="0" />
<generator class="assigned" />
</id>
<many-to-one name="nivelByIdnivel" class="organograma.Nivel" update="false" insert="false" fetch="select">
<column name="IDNIVEL" precision="22" scale="0" not-null="true" />
</many-to-one>
<many-to-one name="nivelByIdnivelpai" class="organograma.Nivel" fetch="select">
<column name="IDNIVELPAI" precision="22" scale="0" not-null="true" />
</many-to-one>
</class>
Obrigado ai pela ajuda de vocês.