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.
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
[code]
@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;
}
}[/code]
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…
[code]
@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;
}
}[/code]
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 !!!