Como obter o "ID" de um objeto Serializable?

Como sabem, objetos a serem persistidos devem possuir um atributo com anotação @Id
Gostaria de saber se é possível, e como posso pegar esse atributo Id, passando um objeto do tipo Genérico(Object), sem trabalhar direto com as instancias de classe:
cliente1.getId() ou produto1.getId(), por exemplo.

Se possível sem usar Reflection.

O método entityManager.merge(persistenceObject); sincroniza o objeto com o BD e o retorna, logo, vc tem o objeto com suas propriedades.

Mas e quando o objeto não está no banco ainda?
No caso, quando eu inseri na list do meu TableModel, porém ainda não cliquei no “Gravar” ele ainda não se encontra no banco, e eu queria pegar o Id dele antes de gravá-lo.
Ja fiz um método com reflection que funcionou mas fica meio gambiarresco:

public static Object obterIdSerializable(Serializable objeto){
        Object id=null;
        Class classe = objeto.getClass();
        Field[] fields = classe.getDeclaredFields();
        for(Field field : fields){
            if(field.getModifiers()!=Member.PUBLIC)field.setAccessible(true);
            Annotation[] declaredAnnotations = field.getDeclaredAnnotations();
            for(Annotation annotation : declaredAnnotations){
                if(annotation.annotationType() == Id.class){
                    try {
                        id = field.get(objeto);
                    } catch (IllegalArgumentException | IllegalAccessException ex) {
                        Logger.getLogger(ObterIdSerializable.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        }
        return id;
    }

Mas gostaria de saber se tem um jeito mais simples.
Pois o próprio hibernate tem que fazer isso em alguns casos, será que ele faz por reflection também?

Com reflection você acessa facilmente, leia o metodo getKey(Object) deste link: http://code.google.com/p/wryel/source/browse/springmvc-tiles-jpa/springmvc-tiles-jpa-core/src/main/java/br/com/wryel/dao/impl/GenericJPADAOImpl.java

[]'s

De onde saiu aquela classe ReflectionHelper?

daqui: http://code.google.com/p/wryel/source/browse/springmvc-tiles-jpa/springmvc-tiles-jpa-core/src/main/java/br/com/wryel/helper/ReflectionHelper.java :smiley:

edit: Sim, o hibernate faz por reflection também, tanto é que se não me falha memória, ele tem o Própio ReflectionUtils dele.

Tive a mesma dúvida do mateusviccari e recorri aos links do WRYEL. Estou testando com a seguinte classe:

[code]import br.com.wryel.dao.DAOFactory;
import br.com.wryel.dao.UsuarioDAO;
import br.com.wryel.model.entity.Usuario;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TesteUsuario {
public static ApplicationContext appContext = new ClassPathXmlApplicationContext(“META-INF/coreApplicationContext.xml”);
private static final DAOFactory daoFactory = new DAOFactory();
public static void main(String args[]){
daoFactory.setApplicationContext(appContext);
UsuarioDAO usuarioDAO1 = DAOFactory.getDAOByInterface(UsuarioDAO.class);
Usuario usuario = usuarioDAO1.findByLoginAndPassword(“rogerio”, “1234”);
System.out.println("Id do usuário: " + usuario.getId());
}
}[/code]
Erro: “Exception in thread “main” org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named ‘usuarioDAOImpl’ is defined”

Então adicionei no coreApplicationContext:

Erro: “org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined”

Obs.: meu projeto é desktop e criei um novo só para testar as classes dos links do br.com.wryel (.dao, .dao.impl, .helper, .model, .model.entity, .model.impl).

Estaria faltando algum arquivo/mapeamento? Estou usando Spring 3.2.3 e pretendo usar Hibernate, com anotações.

Obrigado, Rogerio.

Consegui resolver o problema há alguns dias trocando o EntityManager pelo Session do Hibernate.

Obrigado, Rogerio.