JPA Uma Tabela por Classe

EXISTE UMA NOVA VERSÃO DESSE POST.
CLICK AQUI: http://uaihebert.com/?p=1622&page=14

Olá pessoal, tudo bem?

Vamos falar hoje em como criar uma tabela por classe em uma herança onde cada tabela tem apenas as colunas da sua classe. No último post foi visto como persistir toda a herança em uma tabela apenas.

Irei utilizar o mesmo exemplo do ultimo post já colocando aqui como deve ser o código correto para utilizar essa abordagem.

Ao final do post você encontrará o link para download do projeto de hoje.

Click nos links a seguir para ver o último post sobre o assunto ou qualquer outro post sobre JPA: JPA Uma tabela por herança, Ordernando listas e utilizando Map como atributo mapeado, @ManyToMany Unidirecional e Bidirecional, JPA @OneToMany e @ManyToOne Unidirecional e Bidirecional, @OneToOne Unidirecional e Bidirecional, Mapeando Duas Tabelas em uma Classe, Mapeando Datas (Date) e Enum, Chave Primária Composta, SequenceGenerator, TableGenerator – Chave Primária Simples, Auto Create Schema Script com: Ant, Hibernate 3 e JPA 2, Tutorial Hibernate 3 com JPA 2.

Veja como ficará nosso código:

package com.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;

@Entity
@Table(name="CAR")
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Car {
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private int id;
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
}
package com.model;

import javax.persistence.Entity;

@Entity
public class Beetle extends Car {
	private int gasCapacity;

	public void talk(){
		System.out.println("Herbie!");
	}

	public int getGasCapacity() {
		return gasCapacity;
	}

	public void setGasCapacity(int gasCapacity) {
		this.gasCapacity = gasCapacity;
	}
}
package com.model;

import javax.persistence.Entity;

@Entity
public class Ferrari extends Car {
	private int model;

	// The newest new models will fly... some day! =P
	public void fly() {

	}

	public int getModel() {
		return model;
	}

	public void setModel(int model) {
		this.model = model;
	}
}

Após executar a classe Main, veja como nossas tabelas ficaram:

Agora para cada tabela temos os dados pertinentes a sua respectiva classe.

Gostaria de deixar apenas uma alerta.

Repare que os IDs de todas as nossas classes têm o nome “id”. Caso sua classe tenha um id diferente de sua super classe, será necessário mapear de modo diferente.

Imagine que nossa classe Beetle teria seu id como beetleId, nosso mapeamento teria que apresentar a seguinte anotação a mais:

package com.model;

import javax.persistence.Entity;
import javax.persistence.PrimaryKeyJoinColumn;

@Entity
@PrimaryKeyJoinColumn(name="beetleId")
public class Beetle extends Car {

	private int gasCapacity;

	public void talk() {
		System.out.println("Herbie!");
	}

	public int getGasCapacity() {
		return gasCapacity;
	}

	public void setGasCapacity(int gasCapacity) {
		this.gasCapacity = gasCapacity;
	}
}


Repare que a chave primária agora tem o id com nome diferente da classe Car e Ferrari.

Lembre-se: se sua classe filha tem o nome do campo de id diferente da classe pai, você terá que usar a anotação @PrimaryKeyJoinColumn onde o campo “name” indica qual a coluna a ser mapeada. E caso você queira alterar qual a coluna de ligação na classe pai, basta você utilizar o parâmetro “referencedColumnName”.

Finalizando, vejamos vantagens e desvantagens:

  • Vantagem: Você poderá ter campos not null em sua classe ao contrário da estratégia de uma tabela para toda a herança. E tem vantagens em sobre o próximo tipo mapeamento que veremos: “Uma tabela para cada Sub-Classe com todos os campos da herança”. E segundo o livro “Enterprise JavaBens 3.0” essa estratégia será melhor do que a “Uma tabela para cada Sub-Classe com todos os campos da herança” caso SQL Union não seja suportado por seu banco de dados.
  • Desvantagem: Seu desempenho é pior do que a estratégia de Uma Tabela Para toda a Herança.

Clique aqui para fazer o download do post de hoje. Não esqueça de alterar a senha de conexão e o usuário.

Espero que esse post possa te ajudar.

Qualquer dúvida/colocação basta postar.

Até! o_

4 thoughts on “JPA Uma Tabela por Classe

  1. Entendi como funciona lendo seu tutorial, porém preferi utilizar o @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS).

    Assim não é criada a tabela CAR e são criadas somente tabelas das classes concretas.

Leave a Comment