MappedSuperclass - EJB

5 respostas
J

Gente,

Alguem ja uso a anotação @MappedSuperclass?

Como usar em Herarquias?

Alguem tem algum exemplo?

Ela funciona direitinho, algumas pessoas dizem que ela possui bugs? Isso confere?

Um abraço

5 Respostas

fsquadro

Você já deu uma olhada no tutorial do Hibernate?

http://www.hibernate.org/hib_docs/annotations/reference/en/pdf/hibernate_annotations.pdf

Aqui você encontrará alguns exemplos.

J

Já sim implemente ate um exemplo:

package bean;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.MappedSuperclass;
import javax.persistence.Table;
import javax.persistence.TableGenerator;

import org.hibernate.annotations.Entity;

/**
 * @author mirla.braga
 * @since 30/05/2007
 */
@Entity
@MappedSuperclass
@TableGenerator(name = "PESSOA_GEN", table = "GENERATOR_ID", pkColumnName = "ID", valueColumnName = "VALOR", pkColumnValue = "PESSOA", allocationSize = 1)
@Table(name="PESSOA")
public class Pessoa {
	
	@GeneratedValue(strategy = GenerationType.TABLE, generator = "PESSOA_GEN")
	protected Integer id;
	
	protected String nome_curto;
	
	protected String nome_completo;
	
	public Pessoa(){
		
	}
	
	public Pessoa(String nome_curto, String nome_completo){
		
		this.nome_curto = nome_curto;
		this.nome_completo = nome_completo;
		
		
	}
        
        gets e sets (...)

------------
package bean;

import javax.persistence.AttributeOverride;
import javax.persistence.Column;
import javax.persistence.Table;

import org.hibernate.annotations.Entity;

/**
 * @author mirla.braga
 * @since 30/05/2007
 */
@Entity
@Table(name="FUNCIONARIO")
public class Funcionario extends Pessoa{
	
	@AttributeOverride(column=@Column, name="")
	private Integer id;
	
	private String matricula;
	
	private String cargo;
	
	public Funcionario(){
		
	}
	
	public Funcionario(String nome_curto, String nome_completo, String matricula, String cargo){
		
		nome_curto = super.nome_curto;
		nome_completo = super.nome_completo;
//		super(nome_curto, nome_completo);
		this.matricula = matricula;
		this.cargo = cargo;
	}
	gets e sets(...)

e depois tentei persistir

public class MainClass {

	private static EntityManagerFactory emf = Persistence
			.createEntityManagerFactory("exemplo");

	private static EntityTransaction etTrans;

	public static EntityManager em;

	public MainClass() {
		
		em = emf.createEntityManager();
		etTrans = em.getTransaction();
		etTrans.begin();

//		Funcionario funcionario = new Funcionario("Mirla Braga", "Mirla Rafaela R. Braga", "0261782", "Prog. Estagiaria");
		Funcionario funcionario = new Funcionario();
		
		funcionario.setCargo("est. pro");
		funcionario.setMatricula("0261782");
		funcionario.setNome_completo("Mirla Braga");
		funcionario.setNome_curto("Mirlinha");
		
		em.persist(funcionario);
		
		etTrans.commit();
		
		em.close();
	}

	/**
	 * @param args
	 * @autor mirla.braga
	 * @since 30/05/2007
	 */
	public static void main(String[] args) {
		System.out.println("========= Cadastro Funcionario ===========");
		new MainClass();
		System.out
				.println("========= Cadastro Efetuado com Sucesso ===========");
	}
}

So que esta tando o erro:

========= Cadastro Funcionario ===========
DEBUG 30-05 11:08:14,094 (SessionImpl.java:<init>:220)  -opened session at timestamp: [telefone removido]
DEBUG 30-05 11:08:14,097 (JDBCTransaction.java:begin:54)  -begin
DEBUG 30-05 11:08:14,097 (ConnectionManager.java:openConnection:415)  -opening JDBC connection
DEBUG 30-05 11:08:14,097 (JDBCTransaction.java:begin:59)  -current autocommit status: true
DEBUG 30-05 11:08:14,098 (JDBCTransaction.java:begin:62)  -disabling autocommit
Exception in thread "main" java.lang.IllegalArgumentException: Unknown entity: bean.Funcionario
	at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:215)
	at main.MainClass.<init>(MainClass.java:37)
	at main.MainClass.main(MainClass.java:51)

e eu naum sei o que significa

Heelp
F

Verifique se as classes estão especificadas no arquivo persistence.xml

brunossoares

depois envia o exemplo corrigido!
abraços!

rcrezende

Talvez não seja a causa raíz de seu problema, mas por definição MappedSuperclass não são entidades.
Essa classe não será persistida. MappedSuperclasses é para designar que uma entidade herda de uma classe que não é entidade.
Os atributos da MappedSuperclass serão persistidos todos nas classes filhas, como se fosse um “embbeded”.
Portanto, não entendi pq colocou @Table(name=“FUNCIONARIO”).

Rodrigo Carvalho Rezende
http://www.rodrigorezende.net

Criado 30 de maio de 2007
Ultima resposta 2 de jul. de 2009
Respostas 5
Participantes 5