Mapeando Interface com Anotação

3 respostas
B

Salve Pessoal!!

Possuo uma classe que implementa uma interface, a qual por sua vez, possui apenas variáveis estáticas. Gostaria que essas variáveis se tornassem o domínio de valores de um campo criado na tabela oriunda da classe que implementa a interface. Ou seja:

public interface NivelAcesso {

	public static final Integer NENHUM = 0;
	public static final Integer LEITURA = 1;
	public static final Integer ESCRITA = 2;
	public static final Integer EXECUCAO = 3;
	public static final Integer CONTROLE = 4;
		
}
package br.com.giminiani.permissao;

import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import org.hibernate.annotations.ForeignKey;


@Entity(name="tb_acesso")
@ForeignKey(name="nivel_acesso")
public class Acesso implements NivelAcesso{
	
	
	@GeneratedValue(strategy=GenerationType.SEQUENCE,generator = "acesso_id_sequence")
	@SequenceGenerator( name="acesso_id_sequence", sequenceName="acesso_id_sequence" ) // name of the sequence in the db
	@Column(unique=true)
	private Long id;
	
	@EmbeddedId
	@OneToOne
	@JoinColumn(name="id_usuario")
	@ForeignKey(name="fk_acesso_usuario")
	private Usuario usuario;
	
	@EmbeddedId
	@OneToOne
	@JoinColumn(name="id_acao")
	@ForeignKey(name="fk_acesso_acao")
	private Acao acao;
	
	
	public Usuario getUsuario() {
		return usuario;
	}
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	
	public Acao getAcao() {
		return acao;
	}
	public void setAcao(Acao acao) {
		this.acao = acao;
	}
	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	
	
}

Uma tabela "tb_acesso" foi criada no banco. No entanto, gostaria que ela possuísse o campo "nivel_acesso" com o domínio definido na Interface [0,4].

Desde já, grato.

Bruno

3 Respostas

Hebert_Coelho

Pq uma interface??

Sério, pq vc não usa um ENUM? É totalmente “anti-OO” utilizar uma interface para mapear atributos.

E é ultra simples de mapear ENUM para dentro da classe: Mapeando Datas (Date) e Enum

B

Salve meu caro jakefrog.

Trata-se de uma interface porque, num futuro próximo, assinarei métodos de autenticação, os quais devem ser implementados obrigatoriamente. Cheguei a fazer com Enum. No entanto, gostaria de saber se é possível fazer com Interface. Além disso, visto que colocaria regras como uma validação de um token, por exemplo, continuaria sendo anti OO.

Desde já, obrigado pela ajuda,
Bruno

Hebert_Coelho

O JPA persiste entidades (Entity) para ser uma entidade tem que ser uma Classe com construtor default, ter a anotação @Id em algum campo.

Ou seja, creio que interface apenas não funciona.

Um outro detalhe, pq o método de validação não pode ficar no Enum? Enum tem suporte a métodos por isso não é anti-pattern ele ter métodos. [=

Criado 7 de janeiro de 2012
Ultima resposta 9 de jan. de 2012
Respostas 3
Participantes 2