JPA compartilhando a chave primária!

3 respostas
J

Pessoal,

Estou com um problema com annotations para compartilhar o mesmo id
entre duas Entidades.

  1. Existem 3 classes, Pessoa, PessoaFisica e Usuario. A classe Usuario faz uma composicao da classe PessoaFisica, e eu preciso utilizar o mesmo ID da PessoaFisica. Eu uso como composição, porque a PessoaFisica pode exercer outros papéis, como por exemplo, Empregado.

  2. O grande problema é o fato de que quando eu faço uma pesquisa (HQL) na Classe Usuário ele carrega a PessoaFisica também. Por exemplo:

from Usuario where nomeLogin = 'jukinha'

resultado HQL:

Hibernate: select usuario0_.id as id18_, usuario0_.tdta_inclusao as tdta2_18_, usuario0_.id_usuario_inc as id9_18_, usuario0_.nsta_situacao as nsta3_18_, usuario0_.id_ibv as id10_18_, usuario0_.id_email_pessoa as id11_18_, usuario0_.ddta_encerramento as ddta4_18_, usuario0_.snme_login as snme5_18_, usuario0_.bspr_usuario as bspr6_18_, usuario0_.bbol_auditado as bbol7_18_, usuario0_.sdsc_senha as sdsc8_18_ from seg_usuario usuario0_ where usuario0_.snme_login=?

Hibernate: select pessoafisi0_.id as id26_0_, pessoafisi0_.snme_pessoa as snme3_26_0_, pessoafisi0_.sdsc_pronuncia as sdsc4_26_0_, pessoafisi0_.sdsc_pseudonimo as sdsc5_26_0_, pessoafisi0_.sdsc_site as sdsc6_26_0_, pessoafisi0_.ssta_situacao as ssta7_26_0_, pessoafisi0_.versao as versao26_0_, pessoafisi0_.ntpo_sexo as ntpo9_26_0_, pessoafisi0_.ntpo_estado_civil as ntpo10_26_0_, pessoafisi0_.ddta_nascimento as ddta11_26_0_, pessoafisi0_.id_nacionalidade as id27_26_0_, pessoafisi0_.id_natural as id25_26_0_, pessoafisi0_.ddta_falecimento as ddta12_26_0_, pessoafisi0_.ngra_escolaridade as ngra13_26_0_, pessoafisi0_.snmr_rg as snmr14_26_0_, pessoafisi0_.snmr_digito_rg as snmr15_26_0_, pessoafisi0_.id_estado_rg as id16_26_0_, pessoafisi0_.ddta_expedicao as ddta17_26_0_, pessoafisi0_.snmr_cpf as snmr18_26_0_, pessoafisi0_.id_cnh as id29_26_0_, pessoafisi0_.id_titulo_eleitor as id28_26_0_, pessoafisi0_.id_certificado_reservista as id30_26_0_, pessoafisi0_.id_ctps as id26_26_0_ from glb_pessoa pessoafisi0_ where pessoafisi0_.id=? and pessoafisi0_.stpo_pessoa='F'

Alguém saberia me dizer porque isso ocorre?

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

@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="stpo_pessoa", discriminatorType=DiscriminatorType.STRING, length=1)
@Table (name="tbl_pessoa")
public abstract class Pessoa implements Serializable {
....
	@Id @GeneratedValue(strategy=GenerationType.AUTO, generator="pessoaSeq" )
	public Integer getId() {
		return id;
	}

}

@Entity (name="PessoaFisica")
@DiscriminatorValue("F")
public class PessoaFisica extends Pessoa{
	private Sexo sexo;
....

}

@Entity (name="Usuario")
@Table (name="seg_usuario",
		uniqueConstraints = {@UniqueConstraint(columnNames={"snme_login"})}
)
public class Usuario implements Serializable{

	private String nomeLogin;
	private PessoaFisica pessoaFisica;
...

	@Id @GeneratedValue(generator = "myForeignGenerator")
	@org.hibernate.annotations.GenericGenerator(
			name = "myForeignGenerator",
			strategy = "foreign",
			parameters = @Parameter(name = "property", value = "pessoaFisica")
	)
	public Integer getId() {
		return id;
	}

	@OneToOne
 	@PrimaryKeyJoinColumn
 	public PessoaFisica getPessoaFisica() {
		return pessoaFisica;
	}

}

3 Respostas

J

Nínguem mais responde as questões do fórum não é?

:?: :?:

plentz

Juka,

Primeiro: o fórum é gratuito e aberto. Ninguém aqui ganha pra responder questões. Se você quer exigir respostas, contrate uma consultoria. Caso contrário, continue postando suas questões e torça(e não exija) para que alguém coloque a solução pro seu problema. Ok?

Segundo: sobre seu problema de carregar a outra entidade de forma eager, leia aqui para entender melhor. O problema não é a herança, é o seu OneToOne.
http://www.hibernate.org/162.html
Basicamente, ele faz fetch eager de Entitys OneToOne, mesmo que você tente sobrescrever colocando LAZY.

J

O fato é que postei várias outras questões e nínguem respondeu, achei que tivesse com algum problema. Mas como você mesmo falou, o fórum é gratuito e aberto, responde quem quiser. Por isso lhe agradeço por ter respondido e colaborado.

jukinha :!:

Criado 24 de abril de 2007
Ultima resposta 25 de abr. de 2007
Respostas 3
Participantes 2