Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [JAVA] metodo hashCode() e basi di dati

    Salve, avrei bisogno di una piccola mano per poterne uscire fuori da alcuni problemi che ho riscontrato su un progetto di basi di dati che stò facendo per l'univertà.la base di dati riguarda la gestione di un centro benessere.

    Un problema ce l'ho quando ridefinisco l'operatore di hashing. La classe è:

    public class Cliente{
    private int codice;
    private String nome, cognome, dataNascita, residenza, numTel, tipo;

    public Cliente(int c, String n,String co, String d, String r, String nt, String t){
    codice=c;
    nome=n;
    cognome=co;
    dataNascita=d;
    residenza=r;
    numTel=nt;
    tipo=t;

    }

    public int getCodice(){
    return codice;
    }

    public String getnome()
    {
    return nome;
    }

    public String getCognome()
    {
    return cognome;
    }

    public String getResidenza()
    {
    return residenza;
    }

    public String getNumTel()
    {
    return numTel;
    }

    public String getDataNascita()
    {
    return dataNascita;
    }

    public String getTipo(){
    return tipo;
    }


    public void setCodice(int nuovo){
    codice=nuovo;
    }

    public void setNome(String nuovo)
    {
    nome=nuovo;
    }
    public void setCognomeC(String nuovo)
    {
    cognome=nuovo;
    }

    public void setResidenza(String nuovo)
    {
    residenza=nuovo;
    }


    public void setNumTel(String nuovo)
    {
    numTel=nuovo;
    }
    public void setDataNascitaC(String nuovo)
    {
    dataNascita = nuovo;

    }

    public void setTipo(String nuovo){
    tipo=nuovo;
    }


    public boolean equals(Object o){
    if(o != null && o.getClass() == this.getClass()){
    Cliente c = (Cliente)o;
    return c.getCodice() == this.getCodice();
    } else return false;
    }


    //Ridefinizione dell’operatore di hashing
    public int hashCode()
    {
    return codice.hashCode();
    }

    //Ridefinizione dell’operatore toString()
    public String toString()
    {
    return "Codice cliente: "+this.codice+" Nome: "+this.nome+" Cognome: "+this.cognome+" Data nascita: "+this.dataNascita+
    "Residenza; " +this.residenza+ "Numero telefono: " +this.numTel+ "Tipo cliente: " +this.tipo;
    }
    }
    L'errore è: int cannot be dereferenced
    Questo problema c'è solo se ho un intero(in questo caso int codice). Con altri tipi di parametri non mi da errore.


    L'altro problema ce l'ho con le classi DAO( cioè quelle che gestiscono il codice sql).

    import java.util.*;
    import java.sql.*;
    /* Data Access Object per l’entita’ Abbonamento
    * Incapsula le funzioni ed i tipi dato necessari
    * per manipolare le informazioni
    * della base dati pertinenti a detta entita’.
    * Si tratta di una utility class
    * non istanziabile.
    */

    public class AbbonamentoDAO {
    private AbbonamentoDAO() {
    }

    // Comando SQL per l’inserimento di una nuova istanza
    private static final String INSERT_SQL =
    "INSERT INTO Abbonamento VALUES (?, ?, ?, ?, ?)";
    public static void insert(Abbonamento abbonamento)
    throws SQLException, ClassNotFoundException{
    Connection con=null;
    PreparedStatement pstmt=null;
    con = ConnectionManager.getConnection();
    pstmt = con.prepareStatement(INSERT_SQL);
    //1 errore: cannot find symbol method setCliente(int,Cliente)
    pstmt.setCliente(1, abbonamento.getCliente());
    pstmt.setString(2, abbonamento.getDataI());
    pstmt.setString(3, abbonamento.getDataF());
    pstmt.setString(4, abbonamento.getPrezzo());
    pstmt.executeUpdate();
    pstmt.close();
    con.close(); //si assume la modalita’ autocommit
    }

    //Comando SQL per l’ottenimento di una nuova istanza
    private static final String FIND_BY_NAME =
    "SELECT * FROM Abbonamento WHERE Cliente = ?";
    public static void load(Abbonamento abbonamento)
    throws SQLException, ClassNotFoundException{
    Connection con=null;
    PreparedStatement pstmt=null;
    ResultSet rs=null;
    con = ConnectionManager.getConnection();
    pstmt = con.prepareStatement(FIND_BY_NAME);
    // errore: cannot find symbol method setCliente(int,Cliente)
    pstmt.setCliente(1, abbonamento.getCliente());
    rs=pstmt.executeQuery();
    rs.next();
    abbonamento.setDataI(rs.getString("DATA_I") );
    abbonamento.setDataF(rs.getString("DATA_F") );
    abbonamento.setPrezzo(rs.getString("PREZZO") );
    rs.close();
    pstmt.close();
    con.close();
    }
    //Comando SQL per l’aggiornamento di una nuova istanza
    private static final String UPDATE_BY_NAME =
    "UPDATE ABBONAMENTO SET DATA_I=?,DATA_F=?,PREZZO=? WHERE ABB_CLIENTE = ?";
    public static void update(Abbonamento abbonamento)
    throws SQLException, ClassNotFoundException{
    Connection con=null;
    PreparedStatement pstmt=null;
    ResultSet rs=null;
    con = ConnectionManager.getConnection();
    //errore: cannot find symbol variable UPDATE_BY_CLIENTE
    pstmt = con.prepareStatement(UPDATE_BY_CLIENTE); // errore: cannot find symbol method setCliente(int,Cliente)
    pstmt.setCliente(5, abbonamento.getCliente());

    pstmt.setString(1, abbonamento.getDataI());
    pstmt.setString(2, abbonamento.getDataF());
    pstmt.setString(3, abbonamento.getPrezzo());
    pstmt.executeUpdate();
    pstmt.close();
    con.close();
    }
    }

    La classe Abbonamento è:

    public class Abbonamento {
    private final Cliente cliente;
    private String dataI, dataF, prezzo;

    public Abbonamento(Cliente c, String di, String df, String p){
    cliente=c;
    dataI=di;
    dataF=df;
    prezzo=p;
    }

    public Cliente getCliente(){
    return cliente;
    }

    public String getDataI(){
    return dataI;
    }
    public String getDataF()
    {
    return dataF;
    }
    public String getPrezzo()
    {
    return prezzo;
    }
    public void setDataI(String nuovo)
    {
    dataI =nuovo ;
    }
    public void setDataF(String nuovo )
    {
    dataF=nuovo;
    }
    public void setPrezzo(String nuovo)
    {
    prezzo=nuovo;
    }

    ....



    //Ridefinizione dell’operatore di uguaglianza
    public boolean equals(Object o)
    {
    if (o == null)
    return false;
    if (!(o instanceof Abbonamento ))
    return false;
    Abbonamento o1 = (Abbonamento) o;
    return this.cliente.equals(o1.cliente);
    }



    //Ridefinizione dell’operatore di hashing
    public int hashCode()
    {
    return cliente.hashCode();
    }

    //Ridefinizione dell’operatore toString()
    public String toString()
    {
    return "Abbonamento del cliente: "+this.cliente+" Data inizio: "+this.dataI+
    " Data fine: "+this.dataF+" Prezzo: "+this.prezzo;
    }

    }





    Grazie.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] metodo hashCode() e basi di dati

    Originariamente inviato da Giuseppe83
    public boolean equals(Object o){
    if(o != null && o.getClass() == this.getClass()){
    Cliente c = (Cliente)o;
    return c.getCodice() == this.getCodice();
    } else return false;
    }
    Faccio notare che:

    if(o != null && o.getClass() == this.getClass()){

    è lungo e superfluo, basta

    if (o instanceof Cliente) {


    Originariamente inviato da Giuseppe83
    public int hashCode()
    {
    return codice.hashCode();
    }

    L'errore è: int cannot be dereferenced
    Questo problema c'è solo se ho un intero(in questo caso int codice)
    Ovviamente! int è un tipo primitivo, non è mica un reference! A questo punto ti starai chiedendo: e come faccio ad avere l'hash-code di un int??? Semplice .... è già il valore dell'int un valido hash-code!!!!!

    codice:
    public int hashCode()
    {
        return codice;
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Grazie; mi puoi aiutare anche con gli errori nella classe AbbonamentoDAO?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Giuseppe83
    Grazie; mi puoi aiutare anche con gli errori nella classe AbbonamentoDAO?
    Anche qui è molto banale:

    pstmt = con.prepareStatement(FIND_BY_NAME);
    // errore: cannot find symbol method setCliente(int,Cliente)
    pstmt.setCliente(1, abbonamento.getCliente());

    Ti risulta che PreparedStatement abbia un metodo setCliente()?? A me non risulta proprio.

    Ora ... abbonamento.getCliente() ritorna un Cliente. Quindi il tuo obiettivo sarebbe quello di memorizzare un oggetto in un campo della tabella. Purtroppo non sono esperto di JDBC ma ti posso dire questo: PreparedStatement ha dei metodi setObject() ma ..... dovresti leggere bene la documentazione, perché dice che devono essere degli oggetti di tipi ben precisi.

    Ma potresti anche serializzare il tuo Cliente e memorizzarlo come stream binario. In ogni caso, dovresti anche dirci che tipo di campo hai sulla tabella.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Originariamente inviato da andbin
    Purtroppo non sono esperto di JDBC
    Siamo in 2

    ma ti posso dire questo: PreparedStatement ha dei metodi setObject() ma ..... dovresti leggere bene la documentazione, perché dice che devono essere degli oggetti di tipi ben precisi.
    Ecco, non vorrei direi una panzana, ma credo che mysql ancora non supporti object user-defined (altri database, per esempio Oracle invece sì).

    Ma potresti anche serializzare il tuo Cliente e memorizzarlo come stream binario. In ogni caso, dovresti anche dirci che tipo di campo hai sulla tabella.
    E' quello che farei anch'io.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  6. #6
    Avevo immaginato che il problema fosse il metodo setCliente(). Come si fa a serializzare Cliente?
    La classe Cliente è questa:

    public class Cliente{
    private int codice;
    private String nome, cognome, dataNascita, residenza, numTel, tipo;

    public Cliente(int c, String n,String co, String d, String r, String nt, String t){
    codice=c;
    nome=n;
    cognome=co;
    dataNascita=d;
    residenza=r;
    numTel=nt;
    tipo=t;

    }
    ...
    continaua con i vari metodi get e set, equals() e hashCode()

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.