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, 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.
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.
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 ) );
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…