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.
[ RESOLVIDO ] id em super classe Abstrata com annotations
8 Respostas
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;
}
}
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:
Você pode definir no método get…
Mas de qualquer maneira vai ser obrigado a sobrescrever pelo menos esse.
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
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 !!!!
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…
A alegria durou pouco, depurando pude perceber que os campos id vem nulos… vou ver se consigo resolver… ai eu posto aqui …
Vlws…
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 !!!!