Probleminha Básico em Persistência

Estou tentando criar uma persistência muito simples porém já de cara tá me dando um erro que não sei com resolver, afinal nunca mexi com isso, estou testando um simples cadastro de usuários.
Objeto:

[code]import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
*

  • @author Francisco
    */
    @Entity
    @Table(name = “USUARIO”)
    public class Usuario implements Serializable, Comparable {

    private int codigo = 0;
    public static final String PROP_CODIGO = “codigo”;
    private String nome = “”;
    public static final String PROP_NOME = “nome”;
    private String senha;
    public static final String PROP_SENHA = “senha”;
    private int nivel = 0;
    public static final String PROP_NIVEL = “nivel”;
    private boolean logado = false;
    public static final String PROP_LOGADO = “logado”;
    private Date dataUltimoAcesso;
    public static final String PROP_DATAULTIMOACESSO = “dataUltimoAcesso”;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = “DATA_ULTIMO_ACESSO”)
    public Date getDataUltimoAcesso() {
    return dataUltimoAcesso;
    }

    public void setDataUltimoAcesso(Date dataUltimoAcesso) {
    Date oldDataUltimoAcesso = this.dataUltimoAcesso;
    this.dataUltimoAcesso = dataUltimoAcesso;
    propertyChangeSupport.firePropertyChange(PROP_DATAULTIMOACESSO, oldDataUltimoAcesso, dataUltimoAcesso);
    }

    @Column(name = “LOGADO”)
    public boolean isLogado() {
    return logado;
    }

    public void setLogado(boolean logado) {
    boolean oldLogado = this.logado;
    this.logado = logado;
    propertyChangeSupport.firePropertyChange(PROP_LOGADO, oldLogado, logado);
    }

    @Column(name = “NIVEL”)
    public int getNivel() {
    return nivel;
    }

    public void setNivel(int nivel) {
    int oldNivel = this.nivel;
    this.nivel = nivel;
    propertyChangeSupport.firePropertyChange(PROP_NIVEL, oldNivel, nivel);
    }

    @Column(name = “SENHA”)
    public String getSenha() {
    return senha;
    }

    public void setSenha(String senha) {
    String oldSenha = this.senha;
    this.senha = senha;
    propertyChangeSupport.firePropertyChange(PROP_SENHA, oldSenha, senha);
    }

    @Column(name = “NOME_REAL”)
    public String getNome() {
    return nome;
    }

    public void setNome(String nome) {
    String oldNome = this.nome;
    this.nome = nome;
    propertyChangeSupport.firePropertyChange(PROP_NOME, oldNome, nome);
    }

    @Id
    @Column(name = “CODIGO”)
    public int getCodigo() {
    return codigo;
    }

    public void setCodigo(int codigo) {
    int oldCodigo = this.codigo;
    this.codigo = codigo;
    propertyChangeSupport.firePropertyChange(PROP_CODIGO, oldCodigo, codigo);
    }
    private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);

    public void addPropertyChangeListener(PropertyChangeListener listener) {
    propertyChangeSupport.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
    propertyChangeSupport.removePropertyChangeListener(listener);
    }

    public Usuario() {
    }

    @Override
    public int hashCode() {
    int ret = 0;
    if (this.getCodigo() > 0) {
    ret = (this.getCodigo() * 123);
    }
    return ret;
    }

    @Override
    public boolean equals(Object obj) {
    if (obj == null) {
    return false;
    }
    if (getClass() != obj.getClass()) {
    return false;
    }
    final Usuario other = (Usuario) obj;
    if (this.codigo != other.getCodigo()) {
    return false;
    }
    return true;
    }

    public int compareTo(Usuario o) {
    if (this.hashCode() < o.hashCode()) {
    return -1;
    } else if (this.hashCode() == o.hashCode()) {
    return 0;
    } else if (this.hashCode() > o.hashCode()) {
    return 1;
    } else {
    return 1;
    }
    }

    @Override
    public String toString() {
    return this.getNome();
    }
    }
    [/code]

Teste:

[code]// Create EntityManagerFactory for persistent unit named “pu1”
// to be used in this test
emf = Persistence.createEntityManagerFactory(“HorusPU”);

// Persist all entities
createTransactionalEntityManager();
//System.out.println("Inserting Customer and Orders… " + testInsert());
// Create new customer
Usuario item = new Usuario();
item.setCodigo(10);
item.setNome(“FRANCISCO VIEIRA”);
item.setLogado(false);
// Persist the customer
em.persist(item);
closeTransactionalEntityManager();
[/code]

Saída no console da Exception:

[TopLink Info]: 2009.11.25 02:42:46.921--ServerSession(12893236)--TopLink, version: Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007)) [TopLink Info]: 2009.11.25 02:42:47.656--Not able to detect platform for vendor name [Firebird]. Defaulting to [oracle.toplink.essentials.platform.database.DatabasePlatform]. The database dialect used may not match with the database you are using. Please explicitly provide a platform using property toplink.platform.class.name. [TopLink Info]: 2009.11.25 02:42:48.140--ServerSession(12893236)--file:/C:/Projetos/Desktop/Horus/dist/Horus.jar-HorusPU login successful Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Object: FRANCISCO VIEIRA is not a known entity type. at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:3212) at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.persist(EntityManagerImpl.java:205) at horus.ui.ParametrosUI$1.run(ParametrosUI.java:82) at java.awt.event.InvocationEvent.dispatch(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)

O que estou fazendo errado?

Posta seu persistence.xml. por favor.
O driver do FireBird está no seu classpath?

Sim, o driver está no CP e estou usando ele em “vários” sistemas.

<?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="HorusPU" transaction-type="RESOURCE_LOCAL"> <provider>oracle.toplink.essentials.PersistenceProvider</provider> <properties> <property name="toplink.jdbc.user" value="SYSDBA"/> <property name="toplink.jdbc.password" value="***"/> <property name="toplink.jdbc.url" value="jdbc:firebirdsql://localhost:3050/C:\\BANCO_DE_DADOS.FDB?lc_ctype=ISO8859_1"/> <property name="toplink.jdbc.driver" value="org.firebirdsql.jdbc.FBDriver"/> </properties> </persistence-unit> </persistence>

O problema era no persistence.xml mesmo, eu havia esquecido de colocar a classe persistida:

<?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="HorusPU" transaction-type="RESOURCE_LOCAL"> <provider>oracle.toplink.essentials.PersistenceProvider</provider> <!-- Todas as classes persistentes deve ser listadas aqui --> <class>horus.bean.Usuario</class> <properties> <property name="toplink.jdbc.user" value="SYSDBA"/> <property name="toplink.jdbc.password" value="*****"/> <!-- Errado de proposito para sobrepor pelos parametros passados dinamicamente dentro do sistema --> <property name="toplink.jdbc.url" value="jdbc:firebirdsql://localhost:3050/C:\\BANCO_DE_DADOS_1234.FDB?lc_ctype=ISO8859_1"/> <!-- Errado de proposito para sobrepor pelos parametros passados dinamicamente dentro do sistema --> <property name="toplink.jdbc.driver" value="org.firebirdsql.jdbc.FBDriver1234"/> <!-- Provider-specific settings --> <property name="toplink.logging.level" value="INFO"/> </properties> </persistence-unit> </persistence>

Agora o que eu preciso é sobrepor essas propriedades no persistence.xml por propriedades passadas dinamicamente dentro do sistema, na verdade o que vai mudar é apenas o LOCAL do servidor de banco de dados (que pode mudar de um cliente para o outro).

Tentei criar um EntityManagerFactory como está abaixo porém quando tento persistir me dá um erro de que não encontrou o Driver do banco de dados (porque eu havia colocado errado no persistence.xml para sobrepor pelas propriedades dinâmicas):

[code]Map<String, String> parametros = new HashMap<String, String>();
parametros.put(“EntityManagerFactoryProvider.JDBC_DRIVER_PROPERTY”, “org.firebirdsql.jdbc.FBDriver”);
parametros.put(“EntityManagerFactoryProvider.JDBC_CONNECTION_STRING_PROPERTY”, “jdbc:firebirdsql://localhost:3050/C:\BANCO_DE_DADOS.FDB?lc_ctype=ISO8859_1”);
parametros.put(“EntityManagerFactoryProvider.JDBC_USER_PROPERTY”, “SYSDBA”);
parametros.put(“EntityManagerFactoryProvider.JDBC_PASSWORD_PROPERTY”, “*****”);
parametros.put(“EntityManagerFactoryProvider.TOPLINK_LOGGING_LEVEL”, “INFO”);

// Aqui ele não sobrepõe o que está no persistence.xml
// coloquei um driver errado no persistence.xml de propósito para ver
// se era sobreposto pelo driver correto informado acima, porém deu uma Exception
// de driver errado
Map<String, String> parametros = new HashMap<String, String>();
parametros.put(“EntityManagerFactoryProvider.JDBC_DRIVER_PROPERTY”, “org.firebirdsql.jdbc.FBDriver”);
parametros.put(“EntityManagerFactoryProvider.JDBC_CONNECTION_STRING_PROPERTY”, “jdbc:firebirdsql://localhost:3050/C:\BANCO_DE_DADOS.FDB?lc_ctype=ISO8859_1”);
parametros.put(“EntityManagerFactoryProvider.JDBC_USER_PROPERTY”, “SYSDBA”);
parametros.put(“EntityManagerFactoryProvider.JDBC_PASSWORD_PROPERTY”, “*****”);
parametros.put(“EntityManagerFactoryProvider.TOPLINK_LOGGING_LEVEL”, “INFO”);

emf = Persistence.createEntityManagerFactory(“HorusPU”, parametros);[/code]

Nem criando o Entity Manager passando tb os parametros funciona:

em = emf.createEntityManager(parametros);

Quando vai persistir:

Exception Description: Configuration error. Class [org.firebirdsql.jdbc.FBDriver1234] not found. at oracle.toplink.essentials.exceptions.DatabaseException.configurationErrorClassNotFound(DatabaseException.java:101) at oracle.toplink.essentials.sessions.DefaultConnector.loadDriver(DefaultConnector.java:178) at oracle.toplink.essentials.sessions.DefaultConnector.connect(DefaultConnector.java:98) at oracle.toplink.essentials.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:184) at oracle.toplink.essentials.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:582) at oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:280) at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:229) at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:93) at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:126) at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:99) at horus.ui.ParametrosUI.createTransactionalEntityManager(ParametrosUI.java:161)
Como que faço para isso dar certo?