Torna indietro   Hardware Upgrade Forum > Software > Programmazione

NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT
NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT
Nelle ultime settimane abbiamo provato tre delle proposte top di gamma di NZXT nelle categorie case, dissipatori e ventole. Rispettivamente, parliamo dell'H9 Flow RGB+, Kraken Elite 420 e F140X. Si tratta, chiaramente, di prodotti di fascia alta che si rivolgono agli utenti DIY che desiderano il massimo per la propria build. Tuttavia, mentre i primi due dispositivi mantengono questa direzione, le ventole purtroppo hanno mostrato qualche tallone d'Achille di troppo
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN è il primo monitor gaming con pannello QD-OLED Gen 5 a layout RGB Stripe Pixel e 360 Hz su 34 pollici: lo abbiamo misurato con sonde colorimetriche e NVIDIA LDAT. Ecco tutti i dati
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Nothing Phone (4a) Pro cambia pelle: l'alluminio unibody sostituisce la trasparenza integrale, portando una solidità inedita. Sotto il cofano troviamo uno Snapdragon 7 Gen 4 che spinge forte, mentre il display è quasi da top dig amma. Con un teleobiettivo 3.5x e la Glyph Matrix evoluta, è la prova di maturità di Carl Pei. C'è qualche compromesso, ma a 499EUR la sostanza hardware e la sua unicità lo rendono un buon "flagship killer" in salsa 2026
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 04-11-2010, 10:59   #1
John1905
Junior Member
 
Iscritto dal: Nov 2010
Messaggi: 4
[Richfaces/Hibernate]Inserimento Foreign Keys

Salve a tutti, questo è il mio primo post nel forum.

Vi spiego subito il mio problema.

Stò sviluppando un'applicazione web che utilizza Tomcat 7, MySql 5, Hibernate 3, jsf 1.2 e Richfaces 3.3.3.

Devo creare una pagina che fà un semplice inserimento di un nuovo record in una tabella. Questa tabella, Sottoconto, contiene una Foreign Keys chiamata idConto collegata al'id(un intero) di un'altra tabella, Conto.

Ora, nei file di Hibernate, più precisamente Sottoconto.java, questa chiave è dichiarata come
Codice:
private Conto conto
quindi di tipo conto.

Questo è il form di inserimento:
Codice:
<h:form id="nuovoSottocontoForm">
									
		<div class="divForm">
		<div class="leftDivForm">Conto</div>
		<div class="rightDivForm">
		<h:inputText id="conto" value="#{sottocontoBean.conto }"/>
		<rich:suggestionbox for="conto" var="varConto" suggestionAction="#{contoBean.autocomplete}">
		<h:column>
	        <h:outputText value="#{varConto.descrizione}"/>
		</h:column>
		</rich:suggestionbox>
		</div>
		</div>
		<div class="divForm">
		<div class="leftDivForm">Descrizione</div>
		<div class="rightDivForm"><h:inputText id="descrizione" value="#{sottocontoBean.descrizione }"/></div>
		</div>
		<div class="divForm">
		<div class="leftDivForm">Sigla</div>
		<div class="rightDivForm"><h:inputText id="sigla" value="#{sottocontoBean.sigla }"/></div>
		</div>
		<br class="brNew"/>
		<div class="center-align">
		<a4j:commandButton type="submit" value="Salva" action="#{sottocontoBean.newSottoconto }" >
		</a4j:commandButton>
		</div>
									
		</h:form>
Conto grazie al suggestionBox raccoglie i valori dal db ed effettua l'autocomplete, i dati vengono poi passati alla funzione newSottoconto presente in sottocontoBean.

Codice:
public String newSottoconto() {
			Session session = HibernateUtil.getSessionFactory().getCurrentSession();
	        Transaction t = session.beginTransaction();
	        try {
	        	Sottoconto b = new Sottoconto();
	        	Conto conto;
	        	conto=getConto();
                        b.setConto();
	        	String descrizione;
	        	descrizione=getDescrizione();
	        	b.setDescrizione(descrizione);
	        	String sigla;
	        	sigla=getSigla();
	        	b.setSigla(sigla);
	        	session.persist(b);
	        	t.commit();
	        	//session.close();
	        	//this.getRisultati();
	        } catch (Exception e) {
	        	e.printStackTrace();
	        }
	        return "success";
	    }
Il problema è che inputText passa alla funzione una stringa mentre per l'inserimento è necessario un oggetto di tipo Conto.

Non sò se c'è un metodo per passare alla funzione un oggetto di tipo conto(ho provato sia con setPropertyActionListener sia con Param senza risultati) oppurese si può gestire la cosa direttamente nella funzione.
Avevo pensato anche a fare una query facendo una ricerca avendo come base la stringa(lo avevo fatto in jsp ed effettivamente funzionava) però visto che poi avrei altre tabelle con un numero maggiore di chiavi esterne ho paura che la cosa con molti record diventerebbe eccessivamente pesante.

Spero di essere stato sufficientemente chiaro, grazie in anticipo.
John1905 è offline   Rispondi citando il messaggio o parte di esso
Old 04-11-2010, 11:49   #2
javacomelava
Member
 
Iscritto dal: May 2009
Messaggi: 129
Se ho capito bene:

L'utente inserisce in questa tabella delle informazioni relative ad un "Sottoconto" che (a livello di db) è in relazione (figlia) di una entità Conto.
La relazione è realizzata attrverso foreign key formata dall'id del conto sulla tabella sottoconto.

Supponendo che a questo punto dell'elaborazione (ovvero quando mostri questa tabella)tu conosca il CONTO a cui l'utente si sta riferendo,o meglio,la sua primary key(mi sembra difficile pensare il contrario,perchè significherebbe che non hai per niente chiaro il dominio dell'appliczione che stai costruendo),nel metodo del service (newSottoconto) come prima operazione dovrai effettuare una query che ti recupara l'entità CONTO attraverso la sua primary key che conosci. Quindi creare un nuovo SOTTOCONTO,settargli dentro il CONTO recuparato precedentemente e quindi effettuare l'INSERT del SOTTOCONTO creato.

P.s.: Un consiglio che mi sento di darti è:
Dai dei nomi comprensibili alle variabili e ai metodi,perchè cosi come stai facendo rendi il codice inleggibile sia per te (tra 15giorni) che per gli altri!

Comunque in pseudocodice quello che devi fare è:

Codice:
public String creaSottocontoService(Integer idConto){
   Conto conto = HibernateService.findConto(idConto);
   Sottoconto sottoconto = new Sottoconto();
   sottoconto.setParametro(x);
   sottoconto.setParametro(y);
   ...........
   ...........
   
    /* Qui setti la relazione tra conto e sottoconto */
    sottoconto.setConto(conto);
    HibernateService.inserisciSottoconto(sottoconto);
    return "success";
}
Ciao
javacomelava è offline   Rispondi citando il messaggio o parte di esso
Old 04-11-2010, 12:06   #3
John1905
Junior Member
 
Iscritto dal: Nov 2010
Messaggi: 4
Ho già provato con la query, passandogli direttamente l'id invece della descrizione e funziona.
Soltanto se per ora è perfettamente fattibile ho paura che andando avanti nel progetto(avrà tabelle con un buon numero di chiavi esterne che fanno riferimento a tabelle con un notevole numero di record) ho paura la cosa diventi pesante.

Speravo ci fosse un modo di passare direttamente l'oggetto dal form(varConto) alla funzione ma sembra che l'unico modo fattibile sia con la query.

Comunque passando ad altro, con varConto.idConto recupero l'id all'interno del suggestion box, se aggiungo un
Codice:
<h:outputText value="#{varConto.idConto}"/>
lo stampa correttamente. A questo punto avrei il problema di dover comunque visualizzare la descrizione nell'inputText ma di dover passare alla funzione l'id. C'è modo di passare un valore che non sia quello scritto sull'inputText?

Grazie mille.

Ultima modifica di John1905 : 04-11-2010 alle 12:29.
John1905 è offline   Rispondi citando il messaggio o parte di esso
Old 04-11-2010, 13:29   #4
javacomelava
Member
 
Iscritto dal: May 2009
Messaggi: 129
Non credo di aver capito bene cosa vuoi fare,prova a spiegarti meglio.

come fai a valorizzare la variabile DESCRIZIONE di CONTO se ancora non hai un CONTO???

L'idConto ti viene visualizzato perchè (immagino) l'AJAX BRIDGE di richfaces,attraverso un partial submit,valorizza automaticamente la variabile idConto del relativo managed bean(quando scrivi nella suggestion box,che immagino sia collegata ad una variabile sul managed bean contenente una collezione di idConto validi).

Per avere la descrizione del conto:

In qualche modo,quando arrivi a caricare la pagina .jspx in questione ( e quindi viene creato il relativo managed bean) devi già avere il CONTO di cui vuoi la descrizione,caricato:

Va effettua quindi una query che ti valorizza le variabili relative al conto sul manged bean (richiamando ad esempio il service adibito al recupero di un CONTO nel costruttore del managed bean).A questo punto avresti tutte le informazioni relative ad un conto,compresa la descrizione. Per arrivare a ciò devi gia possedere l'id del conto da caricare.

Quindi:

Nel Managed Bean:

Codice:
public class InserimentoSottocontoBean {

    ......
    ......
    private Conto conto;
    
    public InserimentoSottocontoBean(){
        /* Recuperi il cono in fase di creazione del bean */
        conto = HibernateService.recuperaConto(idConto);
        .........
        .........
    }

    public Conto getConto(){
       return this.conto; 
    }

    public void setConto(Conto conto){
       this.conto=conto;
    }

    /* cambia nome a questo metodo ti prego,chiamalo inserisciSottoconto :-))))))   */
    public String newSottoconto(Integer idConto){
         ..........
         .......... 
         ..........
    }


}
nella .jspx

Codice:
................
<h:outputLabel value="Descrizione Conto" />
<h:outputText value="inserimentoSottocontoBean.conto.descrizione" />
..............
Ovviamente quell'inputText dove dovresti inserire l'id del conto è anomala,in quanto in questo caso si presuppone che tu gia sappia l'ide del conto da caricare (dato che il caricamento del CONTO avviene in fase di creazione del ManagedBean).

Per ovviare a questa problema:

1. dividi in pagine e in manged bean diversi quelli relativi a "Richiesta conto" e "Inserimento Sottoconto"

2. li utilizzi nella stessa pagina jspx,ma in due managed bean diversi, utlizzando l'attibuto RENDERED su dei panelGroup in modo appropriato (renderizzi il pannello contentene i dati del conto solo dopo aver valorizzato l'idConto ----> il manged bean di "descrizione conto" viene creato solo quando avviene l'effettiva renderizzazione)

Ultima modifica di javacomelava : 04-11-2010 alle 13:50.
javacomelava è offline   Rispondi citando il messaggio o parte di esso
Old 04-11-2010, 16:08   #5
John1905
Junior Member
 
Iscritto dal: Nov 2010
Messaggi: 4
Allora, ti spiego meglio.

suggestionAction richiama la funzione
Codice:
public List<Conto> autocomplete{...}
che richiama a sua volta una query che restituisce tutti i record della tabella Conto.
Quindi varConto contiene una lista di tutti i record presenti nella tabella Conto, infatti con varConto.idConto, varConto.descrizione e varConto.sigla richiamo i vari campi(nell'esempio che ti ho postato quando scrivo nell'inputText si apre il menù a tendina con tutte le descrizioni).

L'oggetto all'interno della pagina quindi credo ci sia il problema è che inputText ed outputText non interagiscono con l'oggetto(quindi quando seleziono una descrizione dalla lista lui si limita a copiarmi l'outputText nell'input text senza effettivamente "scegliere" l'oggetto come può accadere con un comboBox).

A questo punto potrei semplicemente passare la stringa con la descrizione a inserimentoSottoconto e fare la query in base alla descrizione invece che in base all'id(descrizione è comunque un valore univoco).
Oppure potrei provare a implementare un comboBox(non sò di preciso come funzionano in Richfaces e se sia possibile implementarci l'autocomplete ma in php questa cosa l'ho già fatta...)

Ora faccio un pò di prove, grazie ancora.
John1905 è offline   Rispondi citando il messaggio o parte di esso
Old 04-11-2010, 16:22   #6
javacomelava
Member
 
Iscritto dal: May 2009
Messaggi: 129
Immagino quindi che quando hai scelto un "CONTO" tramite l'autosuggestion questo venga memorizzato in una variabile di tipo Conto (sul managed bean). Se è cosi non capisco dove sta il problema....hai tutto in quella variabile:

Codice:
List<Conto> autocomplete();
e poi qualcosa del tipo:

Codice:
Conto selectedConto;
dove viene memorizzato il Conto selezionato.


Non so se l'autosuggestion funziona cosi' (non credo,ma puoi comunque arrivarci a farglielo fare tipo con javascript smagheggiando un pò)

Le combobox funzionano proprio nel modo che ti ho descritto.

Hanno una lista che rappresenta le OPTIONS e una variabile che rappresenta il valore SELECTED.
javacomelava è offline   Rispondi citando il messaggio o parte di esso
Old 04-11-2010, 17:01   #7
John1905
Junior Member
 
Iscritto dal: Nov 2010
Messaggi: 4
Credo che il problema sia che in questo modo, con inputText ed outputText, non và a selezionare effettivamente l'oggetto come avviene in un comboBox ma si limita a copiare l'outputText nell'inputText.

A questo punto provo il comboBox, in alternativa vedo di inventarmi qualcosa in javascript.
John1905 è offline   Rispondi citando il messaggio o parte di esso
Old 04-11-2010, 20:16   #8
javacomelava
Member
 
Iscritto dal: May 2009
Messaggi: 129
Si,direi che la combobox è la naturale soluzione al tuo problema
javacomelava è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abb...
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz ASUS ROG Swift OLED PG34WCDN recensione: il prim...
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico Recensione Nothing Phone (4a) Pro: finalmente in...
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro WoW: Midnight, Blizzard mette il primo, storico ...
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Il fondatore di Framework: il personal c...
JBL Live Flex 3 a 129€ su Amazon: ANC ad...
Come un uomo ha costruito un'azienda da ...
Multe fino a 400 euro anche se hai pagat...
Tapo lancia una valanga di offerte su Am...
Little Snitch su Linux: finalmente dispo...
John Deere accetta un accordo da 99 mili...
Gli astronauti di Artemis II osservano i...
OpenAI lancia ChatGPT Pro da 100 dollari...
Allarme rosso: CPU-Z e HWMonitor, segnal...
Arriva su Instagram la funzione per modi...
Le offerte del mondo Apple: iPhone 17 e ...
Italia sotto assedio: il settore governa...
Microsoft fa marcia indietro sull'IA: Co...
Windows 11 24H2 e 25H2: bug negli update...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 16:10.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v