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 :

Problème de séquence avec Hibernate annotation


Sujet :

Hibernate Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 18
    Points : 13
    Points
    13
    Par défaut Problème de séquence avec Hibernate annotation
    Bonjour, je suis en train de développer un Batch en JAVA qui utilise Hibernate (3) et Hibernate Annotation (3.2.0.GA). J'ai une base de données PostGre.
    Lorsque je fais un INSERT j'utilise une séquence. Cette séquence est déjà entamé (j'ai dû faire la refonte d'une application déjà existante).
    La séquence est à 42 et utilise une incrémentation +1. Pourtant à l'INSERT à l'aide de Hibernate l'Id généré est 2400 (environ) et à l'INSERT suivant il incrémente de 50.

    Ma séquence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE SEQUENCE ss_equipment_seq2
      INCREMENT 1
      MINVALUE 1
      MAXVALUE 9223372036854775807
      START 47
      CACHE 1;
    ALTER TABLE ss_equipment_seq2 OWNER TO stat_server;
    Ma classe contenant l'objet à insérer dans la base :
    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
    @Entity
    @SequenceGenerator(name="equipment_seq", sequenceName="ss_equipment_seq2") 
    @Table	(	name="ss_equipment2",
    			schema="public", 
    			uniqueConstraints =	{	@UniqueConstraint(columnNames={"eq_owner", "eq_name", "eq_ip"}), 
    									@UniqueConstraint(columnNames={"eq_owner", "eq_ownerid"})
    								} 
    		)
    public class SsEquipment implements java.io.Serializable
    {
     
    	public static Logger _log = LoggerManager.getInstance().getLogger();
    	private static final long serialVersionUID = 1L;
     
    	@Id    
        @Column(name="eq_id", unique=true, nullable=false)
        @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="equipment_seq") 
    	private int eqId;
     
    ...    
     
    }
    Le bout de code qui permet l'insert :
    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
    	public boolean insert ()
    	{
    		// Ouverture de la transaction
    		Transaction txn = HibernateUtil.currentSession().beginTransaction();
     
    		// Execution de la requête
    		try
    		{
    			_log.debug(LogType.T_CONFIG,"Création de l'équipement : " + this.getId() + " - " + this.getEquipmentKey());
    			HibernateUtil.currentSession().save(this);
    		}
    		catch (Exception e)
    		{
    			_log.error(LogType.T_CONFIG, "Erreur lors de la création de l'équipement : " + e.getMessage());
    			return false;
    		}
    		finally
    		{
    			txn.commit();
    		}
     
    		return true;
    	}
    Et voici mon HibernateUtil :
    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
    41
    public class HibernateUtil
    {
    	private static final SessionFactory sessionFactory;
     
    	static
    	{
    		try
    		{
    			// Crée la SessionFactory
    			sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
    		}
    		catch (HibernateException ex)
    		{
    			throw new RuntimeException("Problème de configuration : " + ex.getMessage(), ex);
    		}
    	}
     
    	public static final ThreadLocal<Session> session = new ThreadLocal<Session>();
     
    	public static Session currentSession() throws HibernateException
    	{
    		Session s = (Session) session.get();
     
    		// Ouvre une nouvelle Session, si ce Thread n'en a aucune
    		if (s == null)
    		{
    			s = sessionFactory.openSession();
    			session.set(s);
    		}
     
    		return s;
    	}
     
    	public static void closeSession() throws HibernateException
    	{
    		Session s = (Session) session.get();
    		session.set(null);
    		if (s != null)
    			s.close();
    	}
    }
    J'ai fait exactement comme dans la documentation Hibernate Annotation et pourtant ça ne marche pas.

    Merci d'avance

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Je m'auto-répond j'ai trouvé la réponse après pas mal de recherche :

    Il faut changer le code de la classe contenant l'objet pour qu'il ai cette tête là :

    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
    @Entity
    @Table	(	name="ss_equipment2",
    			schema="public", 
    			uniqueConstraints =	{	@UniqueConstraint(columnNames={"eq_owner", "eq_name", "eq_ip"}), 
    									@UniqueConstraint(columnNames={"eq_owner", "eq_ownerid"})
    								} 
    		)
    public class SsEquipment implements java.io.Serializable
    {
        /**********************************************************************************************/
        /*** CONSTANTES *******************************************************************************/
        /**********************************************************************************************/
    	
    	public static Logger _log = LoggerManager.getInstance().getLogger();
    	private static final long serialVersionUID = 1L;
    
    
    
    
        /**********************************************************************************************/
        /*** ATTRIBUTS ********************************************************************************/
        /**********************************************************************************************/
    	
    	@Id
    	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_ID") 
        @SequenceGenerator(name = "SEQ_ID", sequenceName = "ss_equipment_seq2", allocationSize = 1) 
        @Column(name="eq_id", unique=true, nullable=false, insertable = false, updatable = false)
    	private int eqId;
    Le @SequenceGenerator se place au niveau de l'attribut. Et il faut rajouter dans @Column, insertable et updatable pour qu'ils ne soient pas présent dans la requête.

    Voilà ça marche nickel après.

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

Discussions similaires

  1. Problème d'initialisation avec Hibernate
    Par fabou3377 dans le forum NetBeans
    Réponses: 3
    Dernier message: 03/04/2009, 07h41
  2. Problème requete SQL avec hibernate
    Par kakahn dans le forum Hibernate
    Réponses: 4
    Dernier message: 13/01/2008, 13h08
  3. Problème de synchronisation avec Hibernate
    Par toutoune60 dans le forum JSF
    Réponses: 2
    Dernier message: 15/04/2007, 13h27
  4. Problème de connection avec Hibernate Synchronizer
    Par ouzzine dans le forum Hibernate
    Réponses: 8
    Dernier message: 30/11/2006, 14h51
  5. [AJAX] Séquence avec AJAX
    Par lapin_hobbit dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 06/11/2006, 15h18

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