IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

[Hibernate3] PostgreSQL + hibernate


Sujet :

Hibernate Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 230
    Points : 104
    Points
    104
    Par défaut [Hibernate3] PostgreSQL + hibernate
    Bonjour,

    Je suis en train de travailler avec Hibernate3 et PostgreSQL9.1.
    Je suis en train de persister une entité User.
    Mon entité:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    @Entity
    public class Userdb {
     
    	@Id
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	@Column(nullable=false, unique=true)
    	private long id;
     
    	@Column(name="first_name")
    	private String firstName;
     
    	@Column(name="last_name")
    	private String lastName;
    Je veux que ce soit la base de données qui génére les identifiants de mes entités : c'est son travail.
    Je génere ma table grâce au modèle, à ma classe avec mon fichier de configuration :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
    		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    		"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
    	<session-factory>
    		<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
    		<property name="hibernate.connection.url">jdbc:postgresql://localhost/TestDB1</property>
    		<property name="hibernate.connection.username">postgres</property>
    		<property name="hibernate.connection.password">pwdTest</property>
    		<property name="show_sql">true</property>
    		<property name="hibernate.dialect">org.hibernate.dialect.ProgressDialect</property>
     
     
    		<property name="hibernate.current_session_context_class">
    			org.hibernate.context.ThreadLocalSessionContext
    		</property>
     
    		<!--  
    		<property name="hibernate.hbm2ddl.auto">update</property>
    <property name="hibernate.hbm2ddl.auto">create</property>
    -->
     
     
    		<mapping class="com.learnfactory.domain.Userdb" />
    	</session-factory>
    </hibernate-configuration>
    je ne comprends pas pourquoi, lorsque je persiste mes entités User, l'identifiant ne commence pas à 1 puis s'incrémente 2,3,4..etc..
    voilà ma table avec ces données:
    id first_name last_name
    327680 Dupont Pierre
    360448 Ducou Jean
    393216 Milou Jeanne
    425984 Duran Lucy
    458752 Dulo Pierre

    oui, je sais : l'essentiel c'est que l'identifiant soit unique et c'est le cas mais pourquoi il commence pas à 1, 2, 3 ...etc

    merci d'avance pour vos éclaircissements...

  2. #2
    Membre actif Avatar de mOuLi
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Points : 257
    Points
    257
    Par défaut
    J'ai été plus ou moins confronté au même problème : la gestion des types SERIAL, AUTOINCREMENT ... (c-a-d alimenté par le SGBD) par Hibernate n'est pas la même (c'est défini dans la classe de dialecte : dans ce cas, PostgreSQLDialect). Avec PostgreSQL, Hibernate traite les PK avec une sequence globale (c-a-d partagée pour toutes les tables) nommée "hibernate_sequence". C'est plutôt étonnant puisque PostgreSQL tolère le type SERIAL

    Néanmoins, il est fortement possible que ton problème de numérotation soit lié à cette séquence.

    Si jamais tu utilise le type SERIAL PostgreSQL pour tes PK tu peux utiliser cette proposition de "contournement". Dans ce cas, les PK de chaque table évolueront individuellement (et non plus avec un compteur global).

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 230
    Points : 104
    Points
    104
    Par défaut
    je vois bien qu'il faut passer par les sequences pour gérer l'identifiant technique sous hibernate.
    je galère à essayer de faire marcher ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE hibernate_unique_key
    (
      next_hi integer
    );
    j'ai bricollé ça pour séquence sur une base de donnée; j'ai table...
    avec ce code java, le mapping
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="unique_key")
    @SequenceGenerator(name = "unique_key", sequenceName = "hibernate_unique_key") 
    @Column(name="next_hi", unique=true, nullable=false, insertable = false, updatable = false)
    private long id;
    je lance un test unit avec création d'une entité en base de données et j'ai l'erreur suite, enfin pas vraimant une erreur mais l'exécution s'arrête et pour dernier log dans la console d'eclipse :
    23:29:21,356 DEBUG DefaultIdentifierGeneratorFactory:90 - Setting dialect [org.hibernate.dialect.ProgressDialect]
    rien ne se passe sur la base de données...l'entité n'est pas persisté en base.

    c'est mon driver qui a un problème pourtant, c'est la version(8.1 jdbc3)?
    comment savoir?

    si vous avez une idée sur mon problème, j'ai travaillé avec d'autres base de données avec auto sur l'identifiant tout était logique : 1,2,3......1254;1255...

    merci d'avance pour votre aide..

  4. #4
    Membre actif Avatar de mOuLi
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Points : 257
    Points
    257
    Par défaut
    Je n'y avais pas fait attention au départ mais tu as une erreur dans ta conf Hibernate : il te faut PostgreSQLDialect et non pas ProgressDialect.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 230
    Points : 104
    Points
    104
    Par défaut
    je vais tester ça mais comment se fait-il qu'avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <property name="hibernate.dialect">org.hibernate.dialect.ProgressDialect</property>
    cela marche : CRUD sur ma base de données PostgreSQL. Tout a l'air de bien fonctionner sauf que...
    mon seul problème est la génération d'identifiant technique. Ce n'est pas vraiment un problème car pour le moment tout fonctionne correctement mais....

    Je souhaiterais que les identifiant soient : 1, 2, 3, 4, 5 ....etc... 1252, 1253, 1254....etc... 115214, 115215.
    Aujourd'hui, la première insertion en base, l'identifiant est déjà 11452. La deuxième insertion en base dans une table différente ou pas c'est par exemple 66845.
    Pourquoi ? c'est la séquence qui n'est pas bonne ?
    je souhaiterais, au départ(=j'ai juste générer mon schéma grâce à un script SQL) que dans chaque table de ma base la première insertion soit 1 puis ensuite 2 puis ...etc...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 230
    Points : 104
    Points
    104
    Par défaut
    bien joué !! en mettant PostgreSQLDialect, cela règle mon petit soucis !
    bravo....

    si tu as en + une explication..

  7. #7
    Membre actif Avatar de mOuLi
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Points : 257
    Points
    257
    Par défaut
    Tant mieux que ça fonctionne

    Quant à la question de 'pourquoi ça marchait preque avant ?', je ne saurai te le dire comme ça. Les dialectes Hibernate (pour la plupart des SGBDs) héritent tous d'un même dialecte (classe org.hibernate.dialect.Dialect) définissant un comportement par défaut. Il faudrait comparer les sources des dialectes Progress et PostgreSQL pour voir les ressemblances/différences.

    D'ailleurs (depuis Hibernate 3.2) pour éviter ce type d'erreur, il n'est plus forcément nécessaire de spécifier le dialecte dans la configuration puisqu'il existe un mécanisme de "dialect resolver". Avec ceci, Hibernate exploite les meta-données JDBC de la connexion pour déterminer le SGBD cible et en déduire le dialecte adéquat. C'est expliqué ici

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mapping par Hibernate d'une base de données PostgreSQL
    Par hector_le_dresseur dans le forum Hibernate
    Réponses: 2
    Dernier message: 12/03/2009, 20h57
  2. Réponses: 3
    Dernier message: 18/08/2008, 22h59
  3. Réponses: 3
    Dernier message: 19/07/2007, 10h39
  4. Réponses: 1
    Dernier message: 08/10/2006, 20h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo