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

JDBC Java Discussion :

Persistance d'objets avec jdbc


Sujet :

JDBC Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 17
    Points : 13
    Points
    13
    Par défaut Persistance d'objets avec jdbc
    Voila j'ai une classe Gestion, avec dedans deux ArrayList qui contiennent des objets, j'aimerais faire persister ces arraylist à travers une base de données MySql

    Donc j'ai ma classe Gestion :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    package Gestion;
     
    import java.util.*;
     
     
    import java.io.Serializable;
    public class Gestion implements Serializable{
     
    	//Les Réservations
     
    	private ArrayList lesReservations= new ArrayList();
     
    	public void addReservation(String code, GregorianCalendar dateDemande, int dureeOccupation,
    			GregorianCalendar dateDebut, Personne unePersonne, int nbPersonnes, Emplacement unEmplacement){
    		Reservation r = new Reservation (code, dateDemande, dureeOccupation, dateDebut, unePersonne, nbPersonnes, unEmplacement );
    		lesReservations.add(r);
    	}
    	public ArrayList getLesReservations() {
    		return this.lesReservations;
    	}
    	public Reservation getReservation(String numero){
    		Reservation res = null;
    		for (int i = 0; i<lesReservations.size();i++){
    			if ( ((Reservation)lesReservations.get(i)).getCode().equals(numero)){
    		res = ((Reservation)lesReservations.get(i));}}
    		return res;
    	}
     
    	public ArrayList retrouveReserveClient(String codeClient){
    		ArrayList sesReservations = new ArrayList();
    		for (int i = 0; i<lesReservations.size();i++)
    		{
    		if (((Reservation)lesReservations.get(i)).getUnePersonne().getCodeClient().equals(codeClient))
    		{
    		sesReservations.add(lesReservations.get(i));
    		}}	
    	return sesReservations;	
    	}
     
    	public int nombreReservations(){
    		return lesReservations.size();
    	}
     
    	public float surfaceTotale(){
    		float resultat = 0;
    		for (int i = 0; i < lesEmplacements.size(); i++){
    			resultat = resultat + ((Emplacement)lesEmplacements.get(i)).getSurface();
    		}
    		return resultat;
    	}
     
    	//Les Emplacements
     
    	private ArrayList lesEmplacements = new ArrayList();
     
    	public ArrayList getLesEmplacements(){
    		return this.lesEmplacements;}
     
    	public Emplacement getEmplacement(String numero){
    		Emplacement emp = null;
    		for (int i = 0; i<lesEmplacements.size();i++){
    			if ( ((Emplacement)lesEmplacements.get(i)).getNumero().equals(numero)){
    		emp = ((Emplacement)lesEmplacements.get(i));}}
    		return emp;
    	}
    	public void addRempli(String numero, boolean ombrage, int longueur, int largeur, int taxePersonne,String libelle, int nbChambres, int nbPieces, int presenceWc, boolean terrasse){
    		Rempli r = new Rempli (numero, ombrage, longueur, largeur, taxePersonne, libelle, nbChambres, nbPieces, presenceWc, terrasse);
    		lesEmplacements.add(r);}
    	public void addVide(String numero, boolean ombrage, int longueur, int largeur, int taxePersonne, boolean electricite){
    		Vide v = new Vide (numero, ombrage, longueur, largeur, taxePersonne, electricite);
    		lesEmplacements.add(v);}
     
     
    	public ArrayList retrouveReserveEmp(String codeEmp){
    		ArrayList sesReservations = new ArrayList();
    		for (int i = 0; i<lesReservations.size();i++)
    		{
    		if (((Reservation)lesReservations.get(i)).getUnEmplacement().getNumero().equals(codeEmp))
    		{
    		sesReservations.add(lesReservations.get(i));	
    		}	
    		}	
    	return sesReservations;	
    	}
     
    	//Calculer les dates
     
     
    	//Ressortir les dates disponibles pour un emplacement donné
     
     
     
     
    	//
    	public boolean emplacementsDispo(GregorianCalendar dateDepart){
            boolean b;
            b = true;
     
     
            for (int i = 0; i < lesReservations.size();i++){
            if( ((Reservation)lesReservations.get(i)).getDateDebut().before(dateDepart) && ((Reservation)lesReservations.get(i)).calculeDateFin().after(dateDepart)){
                b = false;
            }}
            return b;
        }
     
     
    }
    Et la classe qui permet de sérialiser et d'envoyer vers la bdd :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    package	Gestion;
    /**SQL to create MySQL Table For Object Storing**/
     
    /*CREATE TABLE javaobjects (
     objectid INT AUTO_INCREMENT,
     object_name varchar(100),
     object_value BLOB,
     primary key (objectid));
     */
     
    import java.io.ByteArrayInputStream;
    import java.io.ObjectInputStream;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
     
    public class SerializeJavaObjects_MySQL {
    	static final String SQL_TO_WRITE_OBJECT = "INSERT INTO JAVAOBJECTS(OBJECT_NAME, OBJECT_VALUE) VALUES (?, ?)";
    	static final String SQL_TO_READ_OBJECT = "SELECT OBJECT_VALUE FROM JAVAOBJECTS WHERE OBJECTID = ?";
     
    	static String driver = "com.mysql.jdbc.Driver";
    	static String url = "jdbc:mysql://localhost/Ecamping";
    	static String username = "client";
    	static String password = "client";
     
    	/**
             * This class will create and return a database connection.
             */
    	public static Connection getConnection() throws Exception {
    		Class.forName(driver);
    		Connection conn = DriverManager.getConnection(url, username, password);
    		return conn;
    	}
     
    	/**
             * This method will write a java object
             * to the database
             * Parameters: connection object and object to be serialized
             */
    	public static long writeJavaObject(Connection conn, Object object)
    			throws Exception {
    		String className = object.getClass().getName();
    		PreparedStatement pstmt = conn.prepareStatement(SQL_TO_WRITE_OBJECT);
    		pstmt.setString(1, className);
    		pstmt.setObject(2, object);
    		pstmt.executeUpdate();
    		ResultSet rs = pstmt.getGeneratedKeys();
    		int id = -1;
    		if (rs.next()) {
    			id = rs.getInt(1);
    		}
    		rs.close();
    		pstmt.close();
    		System.out.println("Serialization Successful."+
    						   "Serialized Class: "+ className);
    		return id;
    	}
     
    	/**
             * This class will de-serialize a java object from the database
             */
    	public static Object readJavaObject(Connection conn, long id)
    			throws Exception {
    		PreparedStatement pstmt = conn.prepareStatement(SQL_TO_READ_OBJECT);
    		pstmt.setLong(1, id);
    		ResultSet rs = pstmt.executeQuery();
    		rs.next();
    		byte[] buf = rs.getBytes("object_value");
    		ObjectInputStream objectIn = null;
    		if (buf != null)
    			objectIn = new ObjectInputStream(new ByteArrayInputStream(buf));
    		Object object = objectIn.readObject();
    		String className = object.getClass().getName();
    		rs.close();
    		pstmt.close();
    		System.out.println("Deserialization Successful."+
    							"\nDeserialized Class: "+ className);
    		return object;
    	}
     
    	/**
             * Testing the serialization and deserialization feature.
             */
     
    	public static void main(String args[]) throws Exception {
    		Connection conn = null;
    		try {
    			/**Creating DB Connection**/
    			conn = getConnection();
    			conn.setAutoCommit(false);
    			/**Creating Test object to Serialize**/
    			Gestion obj = new Gestion();
    			/**
                             * Serializing the object and getting the database id,
                             * which is nothing but an autogenerated key
                             */
    			long objectID = writeJavaObject(conn, obj);
    			conn.commit();
    			System.out.println("Serialized object ID" + objectID);
    			/**
                             * Reading the object from database.
                             * This object is just serialized into database above.
                             */
     
    			Gestion objFromDatabase = (Gestion) readJavaObject(
    					conn, objectID);
    			System.out.println("After Deserialization:");
    			System.out.println("Object Value: " + objFromDatabase);
    			System.out.println("Class: " + objFromDatabase.getClass().getName());
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			/**Closing the database connection**/
    			conn.close();
    		}
    	}
    }
    Cependant quand je lance sous eclipse ca me met :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    java.sql.SQLException: Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate() or Connection.prepareStatement().
    	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
    	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
    	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
    	at com.mysql.jdbc.StatementImpl.getGeneratedKeys(StatementImpl.java:1856)
    	at Gestion.SerializeJavaObjects_MySQL.writeJavaObject(SerializeJavaObjects_MySQL.java:51)
    	at Gestion.SerializeJavaObjects_MySQL.main(SerializeJavaObjects_MySQL.java:101)

  2. #2
    Membre actif

    Inscrit en
    Octobre 2009
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 133
    Points : 295
    Points
    295
    Par défaut
    Bonjour,

    l'erreur parait pourtant assez claire, tu cherches a inserer en base de donnees dans une table contenant une cle primaire que tu ne mets pas dans ton insert (OBJECTID), le compilateur te demande donc d'explication mettre que tu veux generer les cles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.sql.SQLException: Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate() or Connection.prepareStatement().
    Normalement, cela est faisable en rajoutant cela dans un prepareStatement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PreparedStatement psTxnType = con.prepareStatement(query,Statement.RETURN_GENERATED_KEYS);

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Merci de ton aide, je met ou le code que tu m'as passé ?

  4. #4
    Membre actif

    Inscrit en
    Octobre 2009
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 133
    Points : 295
    Points
    295
    Par défaut
    Dans ta methode writeDataObject, tu as la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PreparedStatement pstmt = conn.prepareStatement(SQL_TO_WRITE_OBJECT);
    tu ajoutes donc le deuxieme parametre pour avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PreparedStatement pstmt = conn.prepareStatement(,Statement.RETURN_GENERATED_KEYS);

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Merci de ton aide, tout est ok!

Discussions similaires

  1. Persistance d'un objet avec un model edmx
    Par Julien_G dans le forum Linq
    Réponses: 3
    Dernier message: 09/02/2010, 14h50
  2. Utiliser Java pour la persistence d'objets avec MySQL
    Par wallys dans le forum Persistance des données
    Réponses: 4
    Dernier message: 07/07/2008, 21h19
  3. problème avec la persistance des objets
    Par gentil dans le forum Hibernate
    Réponses: 15
    Dernier message: 04/04/2007, 11h44
  4. [JDBC][connexion persistante] performances avec JDBC
    Par nawac dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 06/05/2003, 10h37
  5. A propos des modèles d'objet (avec sources)
    Par DevX dans le forum C++Builder
    Réponses: 14
    Dernier message: 01/12/2002, 12h22

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