Mapeamento de classes abstratas no hibernate

Caros amigos,
Eu tenho um sistema onde tem uma classe abstrata somente contendo o campo de identificação do USUARIO e a DATA, todas as demais tabelas herdam dela.
Como fazer o mapeamento no hibernate utilizando o tipo tabela concreta, pois todas tabelas incluirão o campo Usuario e Data

Vejam uma parte da classe abstrata:
(ela contem todos os metodos get e set´s)

public abstract class IdData {
 	private String IdUsuario;
	private Date IdData;
...
}

Uma das classes herdeiras:

public class Usuario extends IdData {
  private String usCod;
  private String usSenha;
  private String usSetor;
  private String usNome;
...

public Usuario(String usCod, String usSenha, String usNome, ID_Usuario, Date ID_Data) {
  super(ID_Usuario, ID_Data);
  this.setUsCod(usCod);
  this.setUsSenha(usSenha);
  this.setUsNome(usNome);
...
}

Na base de dados eu devo armazenar os seguintes campos na tabela Usuarios:
usCod
usSenha
usNome
ID_Usuario
ID_Data

Wellington Marinheiro

Olá…

Pq vc não faz diferente? Ao invés de uma classe abstrata que vc estenderia, crie uma classe normal e nas demais classe faça uma composição com ela.

Dê uma olhada em http://www.hibernate.org/hib_docs/annotations/reference/en/html/entity.html#d0e492

Abraços

Wellington, você precisa guardar quem fez a última alteração em cada registro de cada tabela to sistema? Se é isso é extremamente mais simples realizar esta tarefa utilizando um Interceptor.

Ola LIPE,

A idéia é exatamente esta, para cada registro novo, fica registrado o Usuário que o fêz e a data (que pega do sistema). Este procedimento se aplica às demais tabelas que temos no sistema.

Vale salientar que quando tentei fazer o rmapeamento e não citei a clase IdDATA, o sistema não reconheceu os campos IDUSUARIO e IDDATA.

Por favor, me ajusde…
Wellington Marinheiro

Antes de mais nada é uma má prática utilizar herança apenas para evitar digitação.
Contudo, fiz um exemplo aqui para funcionar em seu cenário. Ele foi escrito para Hibernate 2.x, portanto provavelmente terá que fazer alguma alteração para trabalhar com Hibernate 3.x.

MyInterceptor.java

public class MyInterceptor implements Interceptor {
	private String idUsuario;
	public MyInterceptor( String idUsuario ) {
		this.idUsuario = idUsuario;
	}

	/**
	 * a documentação deste método na interface diz:
	 * Called before an object is saved. The interceptor may modify the <tt>state</tt>, which will be used for
	 * the SQL <tt>INSERT</tt> and propagated to the persistent object.
	 *
	 * @return <tt>true</tt> if the user modified the <tt>state</tt> in any way.
	 */
	public boolean onSave( Object entity, Serializable id, Object[] state,
			String[] propertyNames, Type[] types ) throws CallbackException {
		if( entity instanceof IdData ) {
			IdData idData = ( IdData ) entity;
			idData.setIdUsuario( idUsuario );
			idData.setIdData( new Date() );
			
			return true;
		}
		
		return false;
	}

	public boolean onFlushDirty( Object entity, Serializable id,
			Object[] currentState, Object[] previousState,
			String[] propertyNames, Type[] types ) throws CallbackException {
		return false;
	}

	public void preFlush( Iterator entities ) throws CallbackException {}

	public int[] findDirty( Object arg0, Serializable arg1, Object[] arg2,
			Object[] arg3, String[] arg4, Type[] arg5 ) {
		return null;
	}
	
	public Object instantiate( Class arg0, Serializable arg1 ) throws CallbackException {
		return null;
	}

	public Boolean isUnsaved( Object arg0 ) {
		return null;
	}

	public void onDelete( Object arg0, Serializable arg1, Object[] arg2,
			String[] arg3, Type[] arg4 ) throws CallbackException
	{}

	public boolean onLoad( Object arg0, Serializable arg1, Object[] arg2,
			String[] arg3, Type[] arg4 ) throws CallbackException {
		return false;
	}

	public void postFlush( Iterator arg0 ) throws CallbackException {}
}

Para usar adicione o seguinte no local onde instancia a Session:

String idUsuario = // veio de algum lugar
SessionFactory sessionFactory = // veio de algum lugar
Session session = sessionFactory.openSession( new MyInterceptor( idUsuario ) );

Recomendo também a leitura das convenções de código para Java:
http://java.sun.com/docs/codeconv/

Caro LIPE,

Agora fiquei perdido de vêz, tentei entender mas, sinceramente, não consegui captar a funcionalidade da classe MyInterceptor.
Na realidade eu não estou conseguindo fazer o mapeamento da minha classe usuário em funcao da classe IdDATA, que é abstrata mas preciso inserir os dois campos que a classe usuário herada dela na base de dados. !! eu só queria isto !!

Tambem estou correndo atrás de como criar um Criteria onde cheque o login, passando-se o LOGIN e SENHA.

O grande problema é o seguinte; Este é um sistema para conclusão do curso, já está todo rodando pelas vias normais, com repositorios acessando base de dados MySql, tudo beleza!! O professor simplesmente achou que deveriamos incluir novas tecnologias e aí me deparei com este grante problema HIBERNATE que pode vir até facilitar a vida futuramente mas que, para começar, arranha prá caramba…

Desde já, muito grato,
Wellington Marinheiro

Bem, neste caso você deveria ter dito ao professor que o seu programa está ficando pronto, mas que ainda falta um bom tanto para ficar pronto.

Daí ao invés de implementar linguiça você estaria tomando um sorvete :slight_smile: