bonjour,

j'ai une erreur que je n'arrive pas à résoudre ^^. j'ai regardé par ici et par là, j'ai trouvé des petits trucs mais rien n'y fait. en fait, j'ai une architecture très simple pour le moment : BDD <=> JPA/TOPLINK.

j'ai une classe (annotée JPA) tout bête "Account" avec les champs : id, version, username, password

la voici :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
@Entity
@Table(name = "account")
public class Account implements Serializable {
 
  @Id
  @Column(name = "id", nullable = false)
  @GeneratedValue(strategy = GenerationType.AUTO)
  private int id;
 
  @Column(name = "version", nullable = false)
  @Version
  private int version;
 
  @Column(name = "username", length = 20, nullable = false, unique = true)
  private String username;
 
  @Column(name = "password", length = 40, nullable = false)
  private String password;
 
  protected Account() {
  }
 
  public Account(String username, String password) {
    setUsername(username);
    setPassword(password);
  }
 
  @Override
  public String toString() {
    return String.format("[%d,%d,'%s','%s']", getId(), getVersion(), getUsername(), getPassword());
  }
 
  @Override
  public boolean equals(Object obj) {
    Account a = (Account) obj;
    return a == null ? false : a.getUsername().equals(username) && a.getPassword().equals(password);
  }
 
  // setters & getters ...
}
voici maintenant mon fichier persistence.xml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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="org.pro.server.punit" transaction-type="RESOURCE_LOCAL">
    <provider>oracle.toplink.essentials.PersistenceProvider</provider>
    <class>org.pro.server.entity.model.client.Account</class>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="toplink.jdbc.user" value="root"/>
      <property name="toplink.jdbc.password" value="******"/>
      <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/dbname"/>
      <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
      <property name="toplink.ddl-generation" value="drop-and-create-tables"/>
    </properties>
  </persistence-unit>
</persistence>
pour terminer, j'ai fais une classe de test :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class PersistenceTest extends TestCase {
 
  private EntityManagerFactory emf = null;
 
  private EntityManager em = null;
 
  private String PUNIT_NAME = "org.pro.server.punit";
 
  @Override
  protected void setUp() {
    emf = Persistence.createEntityManagerFactory(PUNIT_NAME);
    em = emf.createEntityManager();
  }
 
  @Override
  protected void tearDown() throws Exception {
    em.close();
    emf.close();
  }
 
  public void testPersistence() {
    String username = "admin";
    String password = "azerty";
 
    // ...
 
    String query = "SELECT ACC FROM account AS ACC";
    query += " WHERE ACC.username = :username";
    query += " AND ACC.password = :password";
 
    Query q = em.createQuery(query);
    q.setParameter("username", username);
    q.setParameter("password", md5Password);
 
    Account b = (Account) q.getSingleResult();
 
    // ...
  }
}
alors, quand je lance mon test, la connexion s'établie correctement, les tables sont crées si elles n'existent pas et la requête provoque l'erreur qui suit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
java.lang.IllegalArgumentException: An exception occured while creating a query in EntityManager
        at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerImpl.createQuery(EntityManagerImpl.java:194)
        at org.pro.test.entity.PersistenceTest.testPersistence(PersistenceTest.java:60)
Caused by: Exception [TOPLINK-8034] (Oracle TopLink Essentials - 2.0 (Build 35 (02/16/2007))): oracle.toplink.essentials.exceptions.EJBQLException
Exception Description: Error compiling the query [SELECT ACC FROM account AS ACC WHERE ACC.username = :username AND ACC.password = :password]. Unknown abstract schema type [account].
d'où il faut retenir je pense :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Error compiling the query [SELECT ACC FROM account AS ACC WHERE ACC.username = :username AND ACC.password = :password]. Unknown abstract schema type [account]
c'est une histoire de schéma apparemment, mais je ne vois pas comment y remédier... en local, je suis sur mysql 5.4.3 et j'ai une base "dbname" avec la table account dedans bien sûr.

vous avez déjà été confronté au problème ??

merci d'avance !