Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    147

    aggiornare un entità jpa

    Ciao,ho un problema nell'aggiornare una mia entità in un progetto che sfrutta jsf+jpa(hibernate)
    Il problema e che ho letto su internet che si dovrebbe recuperare l'entità dal database con find e poi semplicemente settare il campo,ad esempio di un referenza e in automatico viene settato nel database.Il problema e che la chiave primaria viene generata in automatico dal db e quindi usando

    entityManager.find(chiave) non so che parametro mettere perchè se faccio entità.getId() ottengo la chiave che ho inserito io e non quella generata dal database..cosa posso fare?

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    55
    Non ho capito bene il problema, comunque, find serve per recuperare l'entità dal db, ma poi per aggiornarla devi fare il merge...
    Magari metti un po' di codice per capire meglio.

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Qui c'è il tutorial sulla JPA (Java Persistence API):
    http://docs.oracle.com/javaee/6/tutorial/doc/bnbpy.html

    Le operazioni di base sono essenzialmente 4:

    - find() : recupera un oggetto (record/entity) dal database con la chiave specificata (SQL: SELECT)
    - persist(): crea un nuovo oggetto (record/entity) nel database (SQL: INSERT)
    - merge(): modifica un oggetto (record/entity) già presente nel database (SQL: UPDATE)
    - remove(): elimina un oggetto (record/entity) dal database (SQL: DELETE)

    a parte la prima, le altre tre richiedono l'esistenza di una transazione attiva per poter essere eseguite.
    Non mi dilungo sulle questioni inerenti le entity detached.

    Ciao.
    Ultima modifica di LeleFT; 22-11-2013 a 13:44
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    147
    cavolo ,ho questo problema praticamente ho un entità utente e poi un entità paziente con una relazione onetomany e manytoone,praticamente io vado ad eseguire register...Praticamente io vado a rendere persistenti sia utente che paziente,quindi ora sono in uno stato detached,in seguito faccio paziente.setUtente(u),nella relazione manytoone di paziente ho appunto che devo inserire un utente,quindi inserisco l'utente ed essendo in uno stato attached,il cambiamento dovrebbe essere automatico...mi da il seguente errore: unique constraint (ALLENAVITA.PK_PAZIENTE) violated
    non capisco il perchè,visto che il db è vuoto e questo è il primo inserimento dell'utente e paziente,piccolo particolare
    @Stateful
    @LocalBean




    public class RegistrationService implements Serializable {
    @PersistenceContext

    public EntityManager entityManager;
    @Inject
    private UserTransaction utx;


    public void register(Paziente paziente1,Utente u) throws NotSupportedException, SystemException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException {
    System.out.println("Sto per fare il persist");
    Set<Paziente> settaggiopaz=new HashSet<Paziente>();
    settaggiopaz.add(paziente1);
    u.setPazientes(settaggiopaz);

    entityManager.persist(u);
    entityManager.persist(paziente1);
    paziente1.setUtente(u);










    }

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    147
    l errore è ORA-02291: integrity constraint (ALLENAVITA.FK_PAZIENTE_UTENTE) violated - parent key not found

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    147
    Ad esempio se provo ad inserire utente e paziente e poi inserisco la referenza in utente per il paziente,non mi da errore e me la crea,ma se metto sotto u.setPazientes(p); metto
    paziente1.setUtente(u); che sarebbe per inserire in paziente la referenza ad utente mi da ORA-02291: integrity constraint (ALLENAVITA.FK_PAZIENTE_UTENTE) violated - parent key not found

    //cosi non mi da errore
    System.out.println("Sto per fare il persist");
    Set<Paziente> settaggiopaz=new HashSet<Paziente>();
    settaggiopaz.add(paziente1);
    System.out.println("Sto per persistere l'utente");
    entityManager.persist(u);
    entityManager.persist(paziente1);
    Set <Paziente> p=new HashSet();
    p.add(paziente1);


    System.out.println("Controlla paziente");
    System.out.println(paziente1.getCodiceSanitario()) ;


    u.setPazientes(p);
    //Cosi mi da errore

    public void registerPaziente(Paziente paziente1,Utente u) throws NotSupportedException, SystemException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException, InterruptedException {
    System.out.println("Sto per fare il persist");
    Set<Paziente> settaggiopaz=new HashSet<Paziente>();
    settaggiopaz.add(paziente1);
    System.out.println("Sto per persistere l'utente");
    entityManager.persist(u);
    entityManager.persist(paziente1);
    Set <Paziente> p=new HashSet();
    p.add(paziente1);


    System.out.println("Controlla paziente");
    System.out.println(paziente1.getCodiceSanitario()) ;

    u.setPazientes(p);
    paziente1.setUtente(u);
    Ultima modifica di gaiapuffo; 22-11-2013 a 18:12

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quell'errore salta fuori quando si tenta di persistere un'entità child di una relazione, senza che sia stata resa persistente l'entità parent.

    Non so con precisione come siano strutturate le tue entità, ma in ogni tuo esempio vedo una cosa del genere:

    codice:
    entityManager.persist(u);
    entityManager.persist(paziente1);
    paziente1.setUtente(u);
    Ora, qualunque sia la logica che lega paziente ad utente (ancora non mi è chiara), quella cosa mi pare sbagliata. PRIMA si devono effettuare TUTTI i legami e solo DOPO si rendono persistenti le entità. Quindi, se c'è un legame di chiave tra utente e paziente, la riga

    codice:
    paziente1.setUtente( u );
    va fatta prima di ogni altra azione di persistenza.

    La regola aurea è: prima fai tutto ciò che è necessario affinchè la logica Java sia corretta e solo alla fine chiama in causa la persistenza.

    Le operazioni di persistenza devono essere (quasi) sempre le ultime ad essere fatte.

    In secondo luogo, quando crei dei legami (OneToMany, ecc) specifica sempre i vincoli di integrità referenziale (il CascadeType). Specificando, ad esempio, che il cascade sia PERSIST:

    codice:
    @OneToMany(cascade = CascadeType.PERSIST)
    private Set<Paziente> pazienti;
    A te basta rendere persistente l'entità padre e automaticamente verranno resi persistenti tutti i figli, senza che sia tu a dovertene preoccupare. Vedi qui.

    Quindi:

    codice:
    Utente u = new Utente( ... );
    Paziente p1 = new Paziente( ... );
    Paziente p2 = new Paziente( ... );
    ...
    
    Set<Paziente> mioSet = new HashSet<Paziente>();
    mioSet.add( p1 );
    mioSet.add( p2 );
    ...
    
    u.setPazienti( mioSet );
    
    ...
    
    // Automaticamente verranno resi persistenti tutti i pazienti
    entityManager.persist( u );
    Ciao.
    Ultima modifica di LeleFT; 22-11-2013 a 18:12
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    147
    Allora,scusa se rompo le palle Intanto gentilissimo per le risposte.In teoria ho provato anche io con cascade solo che cascade mette il riferimento solo all'entità padre e non al figlio cioè in questo caso ad utente,ma paziente rimane con la referenza a null e quindi posso andare da utente a paziente,ma non vale il viceversa e questo nello sviluppo del programma non mi sembra una buona cosa...

    http://www.html.it/articoli/jpa-2-ch...olteplicita-3/ su questa guida dice proprio che prima devo rendere persistenti l'entità e poi fare il riferimento quindi ho provato a mettere prima


    entityManager.persist(u);
    u.setPazientes(settaggiopaz);
    entityManager.flush();
    entityManager.persist(paziente1);
    paziente1.setUtente(u);
    entityManager.flush();

    mi da errore,quindi primo persisto e poi setto le referenze,come dice la guida ed eseguo il flush per eseguire subito i cambiamenti
    integrity constraint (ALLENAVITA.FK_PAZIENTE_UTENTE) violated - parent key not found

    o poi provato come dicevi tu a mettere prima le referenze e poi persistere ma non va

    u.setPazientes(settaggiopaz);
    paziente1.setUtente(u);

    entityManager.persist(u);



    entityManager.persist(paziente1);

    infine ultima combinazione persistere e poi fare le referenze
    entityManager.persist(u);



    entityManager.persist(paziente1);
    u.setPazientes(settaggiopaz);
    paziente1.setUtente(u);

    Cosi ho fatto tutte le combinazioni ma ci deve essere qualcosa sotto da usare..
    Le relazioni fra entità:Utente

    @OneToMany(fetch=FetchType.LAZY,mappedBy = "utente")
    public Set<Paziente> getPazientes() {
    return this.pazientes;
    }

    Paziente

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "UTENTE")
    public Utente getUtente() {
    return this.utente;
    }

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.