hibernate grammar exception (renommé avec mon 3e post)

hibernate grammar exception (renommé avec mon 3e post) - Java - Programmation

Marsh Posté le 26-04-2008 à 21:30:54    

je cherche la facon "clean" de créer ma méthode createConnection. D'un coté, eclipse me dit dans ma classe PostgreSQLDAOFactory de pas la mettre static alors que dans un DAO quelconque où j'ai besoin d'une connection, ca me demande de la mettre static. Je suis donc pris dans ce cercle vicieux sans savoir la bonne facon de le faire
 

Code :
  1. public class PostgreSQLDAOFactory extends DAOFactory {
  2. public static Connection createConnection() throws Exception {
  3.  try {
  4.   Connection c = DriverManager.getConnection("jdbc:postgresql:vhl", "monid", "monpassword" );
  5.      return c;
  6.  }
  7.  catch (SQLException e) {
  8.   throw e;
  9.  }
  10. }
  11. }


 

Code :
  1. public abstract class DAOFactory {
  2. public static final int POSTGRESQL = 1;
  3. public abstract Connection createConnection() throws Exception ;
  4. public abstract LeagueDAO getLeagueDAO();
  5. public abstract DivisionDAO getDivisionDAO();
  6. public static DAOFactory getDAOFactory(int whichFactory) {
  7.  switch (whichFactory) {
  8.   case POSTGRESQL:
  9.    return new PostgreSQLDAOFactory();
  10.   default:
  11.    return null;
  12.  }
  13. }
  14. }


 

Code :
  1. public class PostgreSQLLeagueDAO implements LeagueDAO {
  2. public void createLeague(String name) throws Exception {
  3.  Connection c = PostgreSQLDAOFactory.createConnection();
  4. }
  5. }


Message édité par burgergold le 27-04-2008 à 04:50:03
Reply

Marsh Posté le 26-04-2008 à 21:30:54   

Reply

Marsh Posté le 26-04-2008 à 21:43:17    

La façon clean, c'est de ne pas faire directement du JDBC mais de passer par un framework ORM style Hibernate.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 26-04-2008 à 21:48:13    

ouais jai l'intention d'utiliser Hibernate ou iBatis dans un avenir prochain mais pour le moment, j'y vais plus par développement itératif. Je fais pas souvent de java et je suis pas mal rouiller dans les mutliples patterns alors j'aimerais débuter sans ceux-ci puisque je ne les connais pas encore

Reply

Marsh Posté le 27-04-2008 à 04:48:51    

bon finalement je fais un petit tuto hibernate et je vois que c'est pas trop compliqué
 
apres avoir réglé plusieurs erreurs, on dirait que hibernate que génère un insert invalide :/
 

Code :
  1. <hibernate-mapping>
  2. <class name="TO.League" table="LEAGUE">
  3.  <id name="id" column="LEAGUE_ID">
  4.   <generator class="native"/>
  5.  </id>
  6.  <property name="name" type="string" column="LEAGUE_NAME"/>
  7. </class>
  8. </hibernate-mapping>


 

Code :
  1. org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
  2. at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
  3. at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
  4. at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
  5. at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
  6. at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167)
  7. at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
  8. at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
  9. at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
  10. at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
  11. at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
  12. at DAO.PostgreSQLLeagueDAO.createLeague(PostgreSQLLeagueDAO.java:20)
  13. at Test.main(Test.java:12)
  14. Caused by: java.sql.BatchUpdateException: L'élément du batch 0 insert into LEAGUE (LEAGUE_NAME, LEAGUE_ID) values (NHL, 4) a été annulé. Appeler getNextException pour en connaître la cause.
  15. at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2537)
  16. at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1328)
  17. at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:351)
  18. at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2674)
  19. at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
  20. at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
  21. ... 9 more


 
devrait pas y avoir des "" ou '' autour de ma string "NHL" dans le insert?

Reply

Marsh Posté le 27-04-2008 à 14:57:42    

up

Reply

Marsh Posté le 27-04-2008 à 18:32:13    

je crois que le probleme vient de ma DB postgresql mais je trouve pas le correctif nécessaire
 
j'ai 1 sequence et 1 table, la table ayant 1 integer et 1 character varying
 
dans mes logs de db:  
 
2008-04-27 11:18:12 EDT LOG:  loaded library "$libdir/plugins/plugin_debugger.dll"
2008-04-27 11:18:14 EDT ERROR:  relation "league" does not exist
2008-04-27 11:18:14 EDT STATEMENT:  insert into LEAGUE (LEAGUE_NAME, LEAGUE_ID) values ($1, $2)

Reply

Marsh Posté le 27-04-2008 à 19:08:32    

Je doute que ton PostgreSQL soit en cause si tu as récupéré une version officielle.

 

Par contre, LEAGUE_ID est probablement une séquence incrémentée automatiquement par Hibernate. Quand je lis ton XML de mapping (en toute honnêteté, je ne connais pas Hibernate, mais c'est ce que j'utiliserais), je comprends que LEAGUE_ID est un id qui est géré comme une séquence, voire une clef primaire, par Hibernate.

 

Par conséquent, si ce que je soupçonne est correct, il ne faut pas passer de valeur pour LEAGUE_ID dans ta requête, Postgres doit gérer cela de façon transparente. En fait, les id ne doivent pas apparaitre dans tes insert. Ou alors tu voulais faire un update et pas un insert.

 

Au passage, si tu fais du Java 5 (1.5) et non du Java 2 (1.4.2), tu as tout intérêt à utiliser les annotations plutôt que des fichiers XML.

Message cité 1 fois
Message édité par el muchacho le 27-04-2008 à 19:19:41

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 27-04-2008 à 20:01:31    

ok cétait une question de case sensitive
quand j'avais mon mapping en majuscule et mes champs dans ma DB en majuscule, ca fonctionnait pas
 
jai tout mis en minuscule et maintenant ca passe

Reply

Marsh Posté le 27-04-2008 à 20:03:05    

el muchacho a écrit :


Au passage, si tu fais du Java 5 (1.5) et non du Java 2 (1.4.2), tu as tout intérêt à utiliser les annotations plutôt que des fichiers XML.


 
Java 6
 
les tuto disait d'utiliser les xml plutot que les properties, jvais regarder ce qu'est un annotation pour voir, merci du conseil

Reply

Marsh Posté le 27-04-2008 à 20:54:09    

burgergold a écrit :

ok cétait une question de case sensitive
quand j'avais mon mapping en majuscule et mes champs dans ma DB en majuscule, ca fonctionnait pas

 

jai tout mis en minuscule et maintenant ca passe


Tiens, curieux, sachant que le SQL est case insensitive. Et tu passes quand même une valeur pour le league_id ? Que se passe-t'il si tu l'enlèves ?


Message édité par el muchacho le 27-04-2008 à 20:57:43

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 27-04-2008 à 20:54:09   

Reply

Marsh Posté le 27-04-2008 à 21:15:05    

non je passe pas de valeur pour league_id
dans mon mapping de la table, j'associe mon league_id avec une sequence (sequence_league_id) qui est défini dans postgresql pour etre auto-increment

Reply

Marsh Posté le 27-04-2008 à 22:06:45    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed