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

    [Java + Hibernate] Il salvataggio di un record ne modifica l'ID

    Salve, premetto che sono nuovo all'utilizzo di Hibernate e poco esperto in genere per quanto riguarda l'interfacciamento con i database.
    Vengo al nocciolo, in pratica io creo un record, ne setto l'ID e subito dopo lo rendo persistente in memoria (successivamente sarà salvato nel DB). Il problema è che io ne imposto l'ID ma subito dopo la save() questo ID viene modificato e non ne capisco il motivo.
    Vi posto il codice di creazione della tabella MySql e subito a seguire il frammento di codice nel quale si verifica l'anomalia.

    TABELLA MYSQL:
    codice:
    -- ----------------------------------------------------- 
    -- Table `phoenix`.`patient` --
    ----------------------------------------------------- 
    CREATE TABLE IF NOT EXISTS `phoenix`.`patient` ( 
    `id_patient` INT NOT NULL AUTO_INCREMENT , 
    `p_birthday` DATE NULL , 
    `p_sex` VARCHAR(1) NULL , 
    `id_p_ethnic_group` INT NULL , 
    PRIMARY KEY (`id_patient`) ) 
    ENGINE = InnoDB;
    FRAMMENTO DI CODICE:
    codice:
    PatientDAO patientDAO = new PatientDAO();
    Patient patient = patientDAO.findById(patientID);
    if (patient == null) {
           patient = new Patient();
           patient.setIdPatient(patientID);
           System.out.println("Patient ID: " + patient.getIdPatient());
           String sex = null;
           for (VariableEvaluatedNetworkNodeType exam : exams) {
                   if (exam.getLocalName().equalsIgnoreCase( "sex")) {
                              sex = (exam.getValue() == 0.0 ? "m" : "f");
                              break;
                   }
           }
           patient.setPSex(sex);
    }
    ss.save(patient);
    System.out.println("Patient ID after save(): " + patient.getIdPatient());
    In pratica, alla prima System.out l'ID è corretto, mentre alla seconda l'ID è stato modificato da Hibernate.
    Se qualcuno sapesse aiutarmi gliene sarei grato!

  2. #2
    Cosa intendi per "è stato modificato da hibernate"?
    Puoi fare degli esempi?

    Inoltre puoi postare il codice dell'Entity patient?

  3. #3
    Dunque, l'entity patient è una normale struttura dati con i suoi campi e i relativi getter e setter (che non posto perchè sarebbe superfluo).

    codice:
    public abstract class Patient implements java.io.Serializable {
    
    // Fields 
    private Integer idPatient;
    private Date PBirthday; 
    private String PSex; 
    private Integer idPEthnicGroup; 
    private Set patientSdos = new HashSet(0); 
    private Set ruleTestHistories = new HashSet(0); 
    
    // Constructors 
    
    /** default constructor */ 
    public Patient() { } 
    
    /** full constructor */ 
    public Patient(Date PBirthday, String PSex, Integer idPEthnicGroup, Set patientSdos, Set ruleTestHistories) {
     this.PBirthday = PBirthday;
     this.PSex = PSex;
     this.idPEthnicGroup = idPEthnicGroup;
     this.patientSdos = patientSdos;
     this.ruleTestHistories = ruleTestHistories;
     }
    Ti faccio un esempio del problema che mi si presenta. Io creo un'istanza di Patient e ne setto l'Integer idPatient (col valore 13) tramite il setter, poi rendo persistente l'oggetto tramite una save() (come puoi vedere nel codice postato nel precedente messaggio) e subito dopo la save() se vado a leggere il campo idPatient ricavandolo tramite il metodo getter questo risulta essere 1.

  4. #4
    Nel mapping entity -> tabella ha settato qualche strategia di generazione id?
    Te lo chiedo perchè nella tabella id è autoincrement.

    Inoltre tu nelle esempio fai una prova con id = 13 per cui dopo la save l'id è uguale a 1.
    Ma ciò vale per ogni valore id?
    nel senso se provi pure con 14,15,16.. quando hibernate salva mette sempre 1?

  5. #5
    mmmh... devo controllare per quanto riguarda la politica di settaggio dell'ID, come ho detto sono nuovo del campo e non so bene dove andare a vedere.
    Per gli ID è così, qualsiasi valore io gli dia dopo mi trovo settato 1, poi suppongo che all'inserimento del record successivo il valore sia 2, ma non ho provato e non posso esserne sicuro. Comunque grazie del suggerimento, ora vedo e ti faccio sapè.

  6. #6
    Ma, il fatto che nella tabella ci sia indicato "autoincrement" può essere la causa del problema? Se così fosse mi basterebbe eliminare quella caratteristica giusto?

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.