Association com Inheritance no Hibernate Annotations

2 respostas
L

Estou travado aqui com um problema, preciso fazer uma associação simples, porém não consigo trabalhar com a herança corretamente…

Eu tenho uma Pessoa e um Fornecedor, que possuem n telefones, então tenho uma associação 1-n entre essas classes e uma classe Telefone. Nas classes Pessoa e Fornecedor vou ter uma collection de Telefone, que vai retornar obviamente a lista de telefones destes (dã).

O problema é que quando uso a anotação @OneToMany(mappedBy=“pessoa”) tenho que colocar uma @ManyToOne em Telefone para uma pessoa, o que acaba gerando que eu tenha uma tabela Telefone com uma coluna telefone_pessoa_id. E eu não quero isso, pois ainda posso ter telefone para Cliente, Fornecedor, etc, então minha tabela Telefone vai ter uma coluna para cada uma das outras tabelas que ela se relaciona.

Tentei usar uma Inheritance em Telefone e criar uma classe TelefonePessoa, TelefoneEmpresa, mas aí tinha que em Pessoa criar uma collection do tipo TelefonePessoa, não consegui usar a superclasse. Não deu muito certo e ficou feio do ponto de vista do projeto.

Qual a melhor forma de resolver isso?
Como ficariam as classes anotadas de forma a eu poder utilizar o modelo de dados enviado?

Obrigado! :slight_smile:


2 Respostas

ACDias

Coloque o @JoinColumn na colection e na pessoa que ele vai gerar certo.
Um ex de um projeto que estou desenvolvendo:

@OneToMany ( cascade = CascadeType.ALL ) @JoinColumn ( nullable = true , name = "idbanca" ) private List &lt Banca &gt bancas;

@ManyToOne ( cascade = CascadeType.ALL ) @JoinColumn ( nullable = false , name = "idcurriculo" ) protected Curriculo curriculo;
Ele gerou as tabelas assim:

Banco: idbanco;idcurriculo; Curriculo: idcurriculo;

L

Essa tua resposta serve para um relacionamento simples, como se houvesse somente Pessoa e Telefone.

Consegui resolver o problema, usando @ManyToOne unidirecional e especificando a JoinTable. Ficou assim:

@Entity
@Table(name="pessoa")
public class Pessoa implements Serializable {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name="pessoa_id")
	private Integer				id;
	private String nome;
	private String				cpf;

	@OneToMany(fetch=FetchType.EAGER)
	@JoinTable(
		name="telefone_pessoa",
	    joinColumns=
	        @JoinColumn(name="pessoa_id", referencedColumnName="pessoa_id"),
	    inverseJoinColumns=
	        @JoinColumn(name="telefone_id", referencedColumnName="telefone_id")
	    )
	private List<Telefone>			telefoneCollection;
}
@Entity
@Table(name="empresa")
public class Empresa  implements Serializable {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name="empresa_id")
	private Integer				id;
	private String nome;
	private String cnpj;
	
	@OneToMany(fetch=FetchType.EAGER)
	@JoinTable(
		name="telefone_empresa",
	    joinColumns=
	        @JoinColumn(name="empresa_id", referencedColumnName="empresa_id"),
	    inverseJoinColumns=
	        @JoinColumn(name="telefone_id", referencedColumnName="telefone_id")
	    )
	private List<Telefone>			telefoneCollection;
}
@Entity
@Table(name="telefone")
@SecondaryTables({
    @SecondaryTable(name="telefone_pessoa"),
    @SecondaryTable(name="telefone_empresa")
})
public class Telefone implements Serializable {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name="telefone_id")
	private Integer				id;
	private String numero;

	@ManyToOne
	@JoinTable(
			name="telefone_pessoa",
		    joinColumns=
		        @JoinColumn(name="telefone_id", referencedColumnName="telefone_id"),
		    inverseJoinColumns=
		        @JoinColumn(name="pessoa_id", referencedColumnName="pessoa_id")
		    )
	private Pessoa pessoa;

	@ManyToOne
	@JoinTable(
			name="telefone_empresa",
		    joinColumns=
		        @JoinColumn(name="telefone_id", referencedColumnName="telefone_id"),
		    inverseJoinColumns=
		        @JoinColumn(name="empresa_id", referencedColumnName="empresa_id")
		    )
	private Empresa empresa;
}

O Hibernate gerou o DDL exatamente igual ao do modelo enviado :wink:

Criado 27 de julho de 2007
Ultima resposta 30 de jul. de 2007
Respostas 2
Participantes 2