[Hibernate] @DiscriminatorColumn como parte de Chave Compost

2 respostas
DirceuSobrinho

Olá

Estou com dificuldades de mapear os seguinte banco de dados

Tabela usr_usuario

PK - composta | cod_usuario
. . . . . . . . . . . . | tipo_usuario

| liferayId

Tabela usr_representante

PK, FK | cod_representante

| restante dos campos

Tabela usr_diretor

PK, FK | cod_diretor

| restante dos campos

Descrição do Cenario:

Usuario é superclasse de Representante e Diretor
codRepresentante e codDiretor são FK do codUsuario.

Como fiz o mapeamento:

Usuario.java

@Entity
@Table(name="usr_usuario")
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="tipo",discriminatorType=DiscriminatorType.INTEGER)
public class Usuario {

	@Id
	private UsuarioPK id = new UsuarioPK();
	private Long liferayId;

UsuarioPK.java

@Embeddable
public class UsuarioPK implements Serializable {

	private Long codUsuario;
	private Integer tipo;

Representante.java

@Entity
@Table(name="rep_representante")
@DiscriminatorValue("1")
public class Representante extends Usuario{

	private Long codRepresentante;
	private String nome;
        ...

OBS.: mapeamento de Diretor é semelhante ao de Representante

No Entanto, se eu gero o Banco de Dados a partir desse mapeamento.
as tabelas Representante e diretor não saem como eu gostaria
sai assim (como campos cod_usuario, tipo que são pra conter nessas tabelas):

tab. rep_representate (como está sendo gerada)

PK|cod_Usuario
. . |Tipo

cod_representante
 demais campos

e gostaria como descrevi logo no inicio.

o que estou faltando fazer e nao estou conseguindo:

  • Mapear codRepresentante como FK de usr_usuario (ja tentei usar @JoinColumn mas não funcionou)
  • e o campo tipo ficar contido apenas na tabela usr_usuario (estou usando a estrategia Joined não sei pq ele está aparencendo nas tabelas filhas, provalvemente pq ele é uma chave composta, como mapear para que ele não apareça nas classes filhas? )

Att. Dirceu

2 Respostas

M

Opa,

Sugiro não usar herança, use associação.

:okok:

DirceuSobrinho

“marcossousa”:
Opa,

Sugiro não usar herança, use associação.

:okok:

Certo, posso usar associação, isso implica em outro problema

public class Representante{

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name = "codRepresentante", unique = true, nullable = false)
	private Long codRepresentante;
	private String nome;

                ...
	
	[b]@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "codRepresentante", nullable = false)
	private Usuario usuario;[/b]

Como a classe Usuario possui uma chave composta [codUsuario, tipo]
o mapeamento Usuario usuario, sera exigido o mapeamento das duas colunas que compõe a chave de Usuario. (através de um @JoinColumns(@JoinColumn(name=“codRepresentante”),@JoinColumn(name=“tipo”))

No entanto, eu não possuo uma coluna tipo na tabela representante…
Usando herança eu setava esse tipo através do @DiscriminatorValue(value=“representante”) [mas quando eu dizia que tipo faz parte de uma chave composta essa solução não funcionava (duvida do meu primeiro post nesse tópico)]

Então, para resolver esse problema eu gostaria de fazer o que:

Inves de utilizar @JoinColumns(@JoinColumn(name=“representante”),@JoinColumn(name=“tipo”)) para mapear Usuario em Representante.

algo que substituisse @JoinColumn(name=“tipo”), por um valor da chave em Usuario, por exemplo um @DiscriminatorValue(value=“representante”)

Acho que não existe algo desse tipo acima, então so me restas as seguintes soluções

Solucões que posso tomar mas não gostaria de adotar:

  • Criar uma coluna tipo, nas tabelas Representante, Diretor, Gerente… com o tipo de usuario, com intuito de mapea-lo no @JoinColumns

  • Ou alterar o lado da Associação

public class Usuario implements java.io.Serializable {

	@Id
	private UsuarioId id;
	private Long liferayId;
	@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "usuario")
	private Representante representante;
	@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "usuario")
	private Diretor diretor;

//Ou Criar uma classe Pai para Representante, Diretor... onde o codigo ficar assim:

                @Id
	private UsuarioId id;
	private Long liferayId;
	@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "usuario")
	private PaiUsuarios usuario;

Att. Dirceu

Criado 5 de dezembro de 2007
Ultima resposta 6 de dez. de 2007
Respostas 2
Participantes 2