Mapeamento com Hibernate e Annotations

Tenho duas classes



@Entity (name="Pessoa")
@SequenceGenerator(
	    name="pessoaSeq",
	    sequenceName="sq_pss_id"
)

@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="tpo_pessoa", discriminatorType=DiscriminatorType.STRING, length=1)
@Table (name="pessoa")
public abstract class Pessoa implements Serializable {
    
    @Id @GeneratedValue(strategy=GenerationType.AUTO, generator="pessoaSeq" )
    private Integer id;
    private int versao;
    private String nome;
    private Situacao situacao;

@Entity (name="PessoaFisica")
@DiscriminatorValue("F")
public class PessoaFisica extends Pessoa{

	private Sexo sexo;
    private EstadoCivil estadoCivil;
    private Date dataNascimento;


@Entity (name="Usuario")
@Inheritance(strategy=InheritanceType.JOINED)
@Table (name="seg_usuario")
public class Usuario implements Serializable{

	@Id 
	private Integer id;
	private String nomeLogin;
	private String senha;
	private Situacao situacao;

	@OneToOne(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
 	@PrimaryKeyJoinColumn
	private PessoaFisica pessoaFisica;

public class Teste {

	public static void main(String[] args) {

		System.out.println("iniciando...");
		Session session = HibernateUtil.getSession();
		System.out.println("Finalizando...");
		session.beginTransaction();
		
		PessoaFisica pf = new PessoaFisica();
		pf.setNome("jukinha");
		pf.setCpf("12345678911");
		
		Usuario u = new Usuario();
		u.setNomeLogin("jukinha");
		u.setSuperUsuario(true);
		u.setSenha("teste");
		u.setSituacao(Situacao.ATIVO);
		u.setPessoaFisica(pf);
		
		//session.save(pf);
		session.saveOrUpdate(u);
		session.getTransaction().commit();
		System.out.println("Salvou...");


Eu preciso compartilhar a chave primária da tabela pessoa ( PessoaFisica ) com a tabela usuario, mas dá o seguinte erro:

[b]

ids for this class must be manually assigned before calling save(): Usuario

[/b]

Se eu fosse mapear pela forma tradicional ficaria assim não é?

<class name="Usuario"  table="usuario">      
        <id name="id" type="int">
            <generator class="foreign">
                <param name="property">pessoaFisica</param>
            </generator>
        </id>       

Porém não sei como mapear com Annotations.
Alguém poderia me ajudar :?:

Ae galera do forum alguem ai já passou por esse problema…

O problema está quando eu salvo o usuário eu gostaria que hibernate utilizace o mesmo ID para as tablelas…

Como faço para que o Hibernate utilize o mesmo ID para tabelas que se relacionam…

Grato a todos que puderem ajudar.

:?: :arrow: :idea:

Se eu fizer assim da forma apresentada abaixo funciona:


public class Teste {

	public static void main(String[] args) {
		System.out.println("iniciando...");
		Session session = HibernateUtil.getSession();
		System.out.println("Finalizando...");

		session.beginTransaction();
		
		PessoaFisica pf = new PessoaFisica();
		pf.setCategoriaHabilitacao(CategoriaHabilitacao.AB);
		pf.setNome("Jukinha ");
		pf.setCpf("1123654789");
		session.save(pf);
		
		Usuario u = new Usuario();
		u.setId(pf.getId());
		u.setNomeLogin("jukinha");
		u.setSuperUsuario(true);
		u.setSenha("teste");
		u.setSituacao(Situacao.ATIVO);
		u.setPessoaFisica(pf);
		
		session.saveOrUpdate(u);
		session.getTransaction().commit();
		System.out.println("Salvou...");

Eu preciso que ao salvar o Usuario a PessoaFisica também seja salvo.

Eu sei que utilizando o mapeamento tradicional (hbm.xml) é possível; mas como eu faço isso utilizando Annotations…

:?:

Juquinha, vc conseguiu resolver o problema citado neste tópico. Estou com o mesmo problema, não consigo compartilhar o id entre as classe relacionadas

Passei o olho e num sei se entendi direito, mas se for o que penso, vc tem que retornar um objeto no save do seu DAO, pegar ele e ler o atributo ID retornado.

public Object save(final Object object) { try { final Session s = getSession(false); s.save(object); s.flush(); return object; //retornei aqui o que foi salvo, tá vendo? } catch (final HibernateException ex) { TOBaseHibernateDao.logger.error(ex); throw convertHibernateAccessException(ex); } }

Bom, se me enganei, desculpa gente, foi o que entendi da pergunta.

O problema é que o id da classe Usuario precisa ser atribuido manualmente, ou então você deve colocar o @GeneratedValue. Antes de inserir no banco, a chave deve estar populada, ou o hibernate tem que saber como gerar isso pra vc. Sacou?

Bem, acho que entendi a mesma coisa do nosso amigo DJemacao, e se vc retornar o objeto que persistiu ao final do save vai funcionar, pq mesmo com auto-incremento ele vai popular a field correspondente a chave primária sacou, dae vc vai ter o objeto que persistiu para poder pegar a chave primaria que vc precisa… Bem, caso não seja isso que deseja da uma outra explicada… vlws :smiley: