[ RESOLVIDO ] id em super classe Abstrata com annotations

8 respostas
D

Ola… com hbms eu tinha uma hierarquia de classes onde o id ficava numa super classe abstrata, e nos mapeamentos das subclasses eu definia, tem como fazer isso com annotations ??? senão tenho que colocar um atributo id identico em todas as classes.

8 Respostas

walacy

Atualmente faço semelhante, mas sobrescrevo tudo…
Cria o atributo e sobrescrevo o get/set…

Coloco os get/set como abstrato para obrigar a implementação na classe filha.

public abstract class AbstractEntity implements Serializable {

	private static final long serialVersionUID = 1L;
	
	public abstract void setId(Long id);

	public abstract Long getId();
}
@Entity
@Table(name = "tbusuario")
@SequenceGenerator(name = "seq_usuario", sequenceName = "tbusuario_id_usuario_seq", allocationSize = 1, initialValue = 1)
@UniqueConstraint(columnNames = "cpf")
@Name("usuario")
public class Usuario extends AbstractEntity {

	private static final long serialVersionUID = 1L;

	@Id
	@Column(name = "id_usuario")
	@GeneratedValue(generator = "seq_usuario", strategy = GenerationType.SEQUENCE)
	private Long id;

	@Override
	public Long getId() {
		return this.id;
	}

	@Override
	public void setId(Long id) {
		this.id = id;
	}
}
D

E mais ai fica mais como um contrato… eu queria mesmo era não implementar nada do id nas subclasses, só a definição do nome da coluna:

walacy

Você pode definir no método get…

Mas de qualquer maneira vai ser obrigado a sobrescrever pelo menos esse.

rod

Tem esse exemplo que coloquei no meu blog explicando como utilizar uma superclasse com por exemplo um “id” ou um campo 'data criacao" e outras entidades herdarem esses atributos.

Seria isso que você precisa?

http://www.rodrigolazoti.com.br/pt/2008/08/04/heranca-de-propriedades-entre-entidades-com-jpa/

[]'s

D

CONSEGUI !!! COM @AttributeOverrides

@MappedSuperclass  
public abstract class Entidade{
	
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)	
	private Integer id;
	
	/**
	 * Metodo de leitura do atributo id
	 * @return id
	 */
	public Integer getId(){
		return id;
	}

	/**
	 * Metodo de escrita para o atributo id
	 * @param id O id e ser definido
	 */
	public void setId(Integer id){
		this.id = id;
	}

}

SUBCLASSES

@Entity
@Table(name="usuario")
@AttributeOverrides( { @AttributeOverride(name="id", column = @Column(name="USU_ID")) } )
public class Usuario extends Entidade implements Serializable {	

	@Column(name="USU_EMAIL", length=31)
	private String email;

	@Column(name="USU_NOME", nullable=false, length=63)
	private String nome;
	
	@OneToOne(targetEntity=TipoUsuario.class, fetch=FetchType.EAGER)
	@JoinColumn(name="TPU_ID")	
	@Fetch(FetchMode.JOIN)
	private TipoUsuario tipo;

    /**
	 * Metodo de leitura do atributo tipo
	 * @return tipo
	 */
	public TipoUsuario getTipo(){
		return tipo;
	}

	/**
	 * Metodo de escrita para o atributo tipo
	 * @param tipo O tipo e ser definido
	 */
	public void setTipo(TipoUsuario tipo){
		this.tipo = tipo;
	}

	/**
     * Construtor
     */
    public Usuario() {
    }

    /**
	 * Metodo de leitura do atributo email
	 * @return email
	 */
	public String getEmail(){
		return email;
	}

	/**
	 * Metodo de escrita para o atributo email
	 * @param email O email e ser definido
	 */
	public void setEmail(String email){
		this.email = email;
	}

	/**
	 * Metodo de leitura do atributo nome
	 * @return nome
	 */
	public String getNome(){
		return nome;
	}

	/**
	 * Metodo de escrita para o atributo nome
	 * @param nome O nome e ser definido
	 */
	public void setNome(String nome){
		this.nome = nome;
	}	
	
	
}

OUTRA SUBCLASSE

@Entity
@Table(name="tipo_usuario")
@AttributeOverrides( { @AttributeOverride(name="id", column = @Column(name="TPU_ID")) } ) 
public class TipoUsuario extends Entidade implements Serializable{
	
	
	@Column(name="TPU_DESC", length=20)
	private String descricao;
	
	/**
	 * Metodo de leitura do atributo descricao
	 * @return descricao
	 */
	public String getDescricao(){
		return descricao;
	}


	/**
	 * Metodo de escrita para o atributo descricao
	 * @param descricao O descricao e ser definido
	 */
	public void setDescricao(String descricao){
		this.descricao = descricao;
	}	

}

Vlws !!!!

walacy

Maravilha, pelo jeito é exatamente o que ele quer.
Muito bom o tuto! Parabéns!

Usarei também… Aprendi uma nova… =D

Ps.: Desculpe a minha ignorância…

D

A alegria durou pouco, depurando pude perceber que os campos id vem nulos… vou ver se consigo resolver… ai eu posto aqui …

Vlws…

D

RESOLVIDO era so implementar Serializable na Superclasse abstrata que eu esqueci....

@MappedSuperclass  
public abstract class Entidade  implements Serializable {
	
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)	
	private Integer id;
	
	/**
	 * Metodo de leitura do atributo id
	 * @return id
	 */
	public Integer getId(){
		return id;
	}

	/**
	 * Metodo de escrita para o atributo id
	 * @param id O id e ser definido
	 */
	public void setId(Integer id){
		this.id = id;
	}

}

SUBCLASSES

@Entity
@Table(name="usuario")
@AttributeOverride(name="id", column = @Column(name="USU_ID"))
public class Usuario extends Entidade implements Serializable {	

	@Column(name="USU_EMAIL", length=31)
	private String email;

	@Column(name="USU_NOME", nullable=false, length=63)
	private String nome;
	
	@OneToOne(targetEntity=TipoUsuario.class, fetch=FetchType.EAGER)
	@JoinColumn(name="TPU_ID")	
	@Fetch(FetchMode.JOIN)
	private TipoUsuario tipo;

    /**
	 * Metodo de leitura do atributo tipo
	 * @return tipo
	 */
	public TipoUsuario getTipo(){
		return tipo;
	}

	/**
	 * Metodo de escrita para o atributo tipo
	 * @param tipo O tipo e ser definido
	 */
	public void setTipo(TipoUsuario tipo){
		this.tipo = tipo;
	}

	/**
     * Construtor
     */
    public Usuario() {
    }

    /**
	 * Metodo de leitura do atributo email
	 * @return email
	 */
	public String getEmail(){
		return email;
	}

	/**
	 * Metodo de escrita para o atributo email
	 * @param email O email e ser definido
	 */
	public void setEmail(String email){
		this.email = email;
	}

	/**
	 * Metodo de leitura do atributo nome
	 * @return nome
	 */
	public String getNome(){
		return nome;
	}

	/**
	 * Metodo de escrita para o atributo nome
	 * @param nome O nome e ser definido
	 */
	public void setNome(String nome){
		this.nome = nome;
	}	
	
	
}

OUTRA SUBCLASSE

@Entity
@Table(name="tipo_usuario")
@AttributeOverride(name="id", column = @Column(name="TPU_ID"))
public class TipoUsuario extends Entidade implements Serializable{
	
	
	@Column(name="TPU_DESC", length=20)
	private String descricao;
	
	/**
	 * Metodo de leitura do atributo descricao
	 * @return descricao
	 */
	public String getDescricao(){
		return descricao;
	}


	/**
	 * Metodo de escrita para o atributo descricao
	 * @param descricao O descricao e ser definido
	 */
	public void setDescricao(String descricao){
		this.descricao = descricao;
	}	

}

Vlws !!!!

Criado 20 de maio de 2010
Ultima resposta 20 de mai. de 2010
Respostas 8
Participantes 3