-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 18 posts ]  Go to page 1, 2  Next
Author Message
 Post subject: Booléen et PostgreSQL
PostPosted: Wed Jun 03, 2009 9:24 am 
Newbie

Joined: Wed Jun 03, 2009 9:17 am
Posts: 8
Bonjour,

J'ai un problème lors de ma migration de Oracle vers PostgreSQL.
L'erreur vient du fait que mon mapping est différent de ma base de données. Certains champs sont "boolean" sous Hibernate et "Numeric" sous PostgreSQL. Il n'y avait pas de problème avec Oracle car celui-ci considère les booléens comme des nombres, mais Postgre les identifie comme des chaînes de caractère. Je me retrouve donc avec des erreurs de types.
J'aimerais savoir s'il existe un paramètre Hibernate permettant de remédier à cela sans modifier le mapping ni la base de données.

Merci d'avance pour votre aide.


Top
 Profile  
 
 Post subject: Re: Booléen et PostgreSQL
PostPosted: Thu Jun 04, 2009 5:53 am 
Hibernate Team
Hibernate Team

Joined: Thu Dec 18, 2003 9:55 am
Posts: 1977
Location: France
salut,
postgres gère avec "true" et "false" c'est ça?
As tu essayé le type de mapping true_false ?

_________________
Anthony,
Get value thanks to your skills: http://www.redhat.com/certification


Top
 Profile  
 
 Post subject: Re: Booléen et PostgreSQL
PostPosted: Thu Jun 04, 2009 8:12 am 
Newbie

Joined: Wed Jun 03, 2009 9:17 am
Posts: 8
Salut,

Oui, Postgres gère avec true et false, mais aussi 'true', 't', et '1'. Mais ma base de donnée attend des numeric lors de l'update, c'est à dire 0 ou 1 (sans les quotes)...
Je n'ai pas trop compris le fonctionnement du mapping true_false, et je ne vois pas trop comment l'utiliser dans mon cas...


Top
 Profile  
 
 Post subject: Re: Booléen et PostgreSQL
PostPosted: Thu Jun 04, 2009 8:18 am 
Hibernate Team
Hibernate Team

Joined: Thu Dec 18, 2003 9:55 am
Posts: 1977
Location: France
"mais aussi 'true', 't', et '1'"
tu veux dire que ce n'est pas homogène?
Soit tu n'as que 'true'/'false' , ou 't'/'f' mais tu ne peut avoir parfois 'true', parfois 't', parfois '0'

Confirmes stp.

Tu utilises les annotations ou les fichiers de mapping?

_________________
Anthony,
Get value thanks to your skills: http://www.redhat.com/certification


Top
 Profile  
 
 Post subject: Re: Booléen et PostgreSQL
PostPosted: Thu Jun 04, 2009 8:33 am 
Newbie

Joined: Wed Jun 03, 2009 9:17 am
Posts: 8
Extrait de la doc Pg:

" Les libellés valides pour l'état « vrai » sont :
TRUE
't'
'true'
'y'
'yes'
'1'

Pour l'état « faux », il s'agit de :
FALSE
'f'
'false'
'n'
'no'
'0'

Les espaces avant et après sont ignorés. Il est recommandé d'utiliser TRUE et FALSE (qui sont compatibles avec la norme SQL). "

Donc si, 'true', 't', '1' sont tous identifiés comme booléen. Par contre pour l'affichage, 't' et 'f' sont utilisés.


Top
 Profile  
 
 Post subject: Re: Booléen et PostgreSQL
PostPosted: Thu Jun 04, 2009 9:10 am 
Hibernate Team
Hibernate Team

Joined: Thu Dec 18, 2003 9:55 am
Posts: 1977
Location: France
1- si tu veux gérer toutes les possibilités, il te faudra un UserType
2- si ton application est la seule client de ta bdd, alors tu peux estimer que tu n'auras qu'un doublet possible TRUE_FALSE
3- tu n'as pas répondu a ma précédente question, annotation ou fichiers de mapping? :-)

_________________
Anthony,
Get value thanks to your skills: http://www.redhat.com/certification


Top
 Profile  
 
 Post subject: Re: Booléen et PostgreSQL
PostPosted: Thu Jun 04, 2009 9:37 am 
Newbie

Joined: Wed Jun 03, 2009 9:17 am
Posts: 8
Alors, mes connaissances dans hibernate étant très faibles, j'avoue que j'ai un peu du mal à comprendre le 1 et 2 ^^
Sinon ce sont des fichiers de mapping.


Top
 Profile  
 
 Post subject: Re: Booléen et PostgreSQL
PostPosted: Thu Jun 04, 2009 9:59 am 
Regular
Regular

Joined: Mon Apr 19, 2004 6:54 pm
Posts: 79
Est ce que cela peut t'aider:
http://docs.jboss.org/hibernate/stable/core/reference/en/html/configuration-optional.html

Quote:
3.4.5. Query Language Substitution

You may define new Hibernate query tokens using hibernate.query.substitutions. For example:

hibernate.query.substitutions true=1, false=0

would cause the tokens true and false to be translated to integer literals in the generated SQL.


Christophe


Top
 Profile  
 
 Post subject: Re: Booléen et PostgreSQL
PostPosted: Thu Jun 04, 2009 10:53 am 
Newbie

Joined: Wed Jun 03, 2009 9:17 am
Posts: 8
J'ai essayé d'ajouter
Code:
<property name="hibernate.query.substitutions"> true=1, false=0 </property>


dans hibernate.cfg.xml, mai j'ai toujours la même erreur de types...

Code:
%t ERROR:  column "flag" is of type numeric but expression is of type boolean at character 45
%t HINT:  You will need to rewrite or cast the expression.


Top
 Profile  
 
 Post subject: Re: Booléen et PostgreSQL
PostPosted: Thu Jun 04, 2009 11:41 am 
Regular
Regular

Joined: Mon Apr 19, 2004 6:54 pm
Posts: 79
ta propriété java est de type boolean et ta colonne postgres de type numeric, c'est bien ça?

Christophe


Top
 Profile  
 
 Post subject: Re: Booléen et PostgreSQL
PostPosted: Thu Jun 04, 2009 11:44 am 
Newbie

Joined: Wed Jun 03, 2009 9:17 am
Posts: 8
Voilà, c'est ça.


Top
 Profile  
 
 Post subject: Re: Booléen et PostgreSQL
PostPosted: Thu Jun 04, 2009 12:00 pm 
Regular
Regular

Joined: Mon Apr 19, 2004 6:54 pm
Posts: 79
peux tu essayer avec cette syntaxe:
Code:
<property name="hibernate.query.substitutions">true 1 false 0</property>


Top
 Profile  
 
 Post subject: Re: Booléen et PostgreSQL
PostPosted: Fri Jun 05, 2009 3:44 am 
Newbie

Joined: Wed Jun 03, 2009 9:17 am
Posts: 8
J'ai essayé cette syntaxe, mais j'obtiens toujours la même erreur...
Est-ce que cette expression cast bien les booléens en numeric ?


Top
 Profile  
 
 Post subject: Re: Booléen et PostgreSQL
PostPosted: Fri Jun 05, 2009 5:45 am 
Hibernate Team
Hibernate Team

Joined: Thu Dec 18, 2003 9:55 am
Posts: 1977
Location: France
je pense que le probleme est global au type.
Il serait utile d'avoir la stacktrace complete de ton pb (comme toujours sur le forum) ainsi qu'un mapping simplifié.
Est ce que ça plante partout? Insert?Update?Select?

_________________
Anthony,
Get value thanks to your skills: http://www.redhat.com/certification


Top
 Profile  
 
 Post subject: Re: Booléen et PostgreSQL
PostPosted: Fri Jun 05, 2009 6:23 am 
Newbie

Joined: Wed Jun 03, 2009 9:17 am
Posts: 8
Voici le mapping simplifié:

Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
   "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="xxx">
   
  <class name="UserDataModel" table="UTILISATEUR">
   
   <id name="id" column="NOGENE" type="long" unsaved-value="0">
        <generator class="xxx">
                <param name="nom">SEQ_REC</param>
        </generator>
    </id>
   
   <property name="password" column="MOTPASS" type="string" length="20" not-null="true"/>
   <property name="login" column="CODE" type="string" length="10" not-null="true"/>
   <property name="flag" column="FLAG" type="boolean" not-null="false"/>
   <property name="nom" column="NOM" type="string" length="35" not-null="false"/>

  </class>
</hibernate-mapping>



et l'erreur

Code:
2009-06-05 11:04:16,546 [http-8080-Processor25] ERROR org.hibernate.util.JDBCExceptionReporter - ERROR: column "flag" is of type numeric but expression is of type boolean
2009-06-05 11:04:16,562 [http-8080-Processor25] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session
org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
   at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:59)
   at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
   at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:181)
   at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:226)
   at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:137)
   at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:274)
   at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
   at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:730)
   at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:324)
   at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:86)
   at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
   at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
   at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
   at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:415)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
   at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
   at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
   at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
   at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
   at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
   at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
   at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
   at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
   at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
   at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
   at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
   at java.lang.Thread.run(Unknown Source)
Caused by: java.sql.BatchUpdateException: L'élément du batch 0 update UTILISATEUR set MOTPASS=***, CODE=***, FLAG=1, NOM=*** where NOGENE=1 a été annulé. Appeler getNextException pour en connaître la cause.
   at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2531)
   at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1344)
   at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:343)
   at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2668)
   at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723)
   at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:57)
   at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:174)
   ... 31 more


Là ça plante à l'update, lors de l'identification. Je ne sais pas pour le reste.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 18 posts ]  Go to page 1, 2  Next

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.