Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [hibernate]

  1. #1

    [hibernate]

    Ciao a tutti !!!
    Sono al mio primo topic su questo sito perchè ultimamente sto cominciando i primi passi in Hibernate 3 ed ho avuto subito un problema.
    Innanzitutto ho fatto una semplice prima applicazione ma non ho ancora "deployato" su tomcat.

    Ho una tabella di un DB Oracle 9.2 con vari campi, ma essa non ha un campo ID e/o primary key.
    Ho creato una classe myBean che voglio contenga solo i valori di 2 campi della tabella, infatti la dalla query che faccio ottengo solo 2 colonne.
    Ho letto che un bean in Hibernate ha bisogno di avere un campo ID ...quindi questa è la mia classe:

    codice:
    package pack;
    
    public class myBean {
    	
    	private Long id;
    	private int	somma;
    	private String provincia;
    	
    	public Long getId() {
    		return id;
    	}
    	private void setId(Long id) {
    	this.id = id;
    	}
    	public int getSomma() {
    		return somma;
    	}
    	public void setSomma(int somma) {
    		this.somma = somma;
    	}
    	public String getProvincia() {
    		return provincia;
    	}
    	public void setProvincia(String provincia) {
    		this.provincia = provincia;
    	}
    	
    	
    	public myBean(){
    	}
    	
    	public myBean(int somma,String provincia){
    		this.setSomma(somma);
    		this.setProvincia(provincia);
    	}
    
    
    	public myBean(Long id,int somma,String provincia){
    		this.setId(id);
    		this.setSomma(somma);
    		this.setProvincia(provincia);
    	}
    
    }
    L'ho mappata nel file "myBean.xml"
    codice:
    <?xml version="1.0" encoding="UTF-8"?>
    
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping schema="hibernate" package="pack">
    	<class name="myBean" table="TBL_BIDOTAX" lazy="false">
    		<id name="id" column="id" >
    			<generator class="sequence">
    				<param name="sequence">honey_id_seq</param>
    			</generator>
     		</id>
    	
    		<property name="provincia" column="TAX_PROV"/>
    		<property name="somma" column="TAX_IMPO"/>
    	</class>
    	
    </hibernate-mapping>
    Ho una classe che effettua la select:
    codice:
    package pack;
    
    import java.util.ArrayList;
    import java.util.List;
    import org.hibernate.HibernateException;
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    
    public class utils {
    	
    	public static List<myBean> listaTutteTasse() {
    		List<myBean> result=null;
    		Session session = HibernateUtil.getSessionFactory().openSession();
    		Transaction tx = null;
    		try {
    			tx = session.beginTransaction();
    			Query q = session.createSQLQuery("select TAX_PROV,TAX_IMPO FROM TBL_BIDOTAX");
    			
    			result =  q.list();
    			tx.commit();
    		}
    		catch (HibernateException he) {
    			if (tx!=null) 
    				tx.rollback();
    			throw he;
    		}
    		finally {
    			session.close();
    		}
    		return result;
    		}
    }
    Ed a questo punto ho provato a lanciare una prova.java
    codice:
    package pack;
    import java.util.Iterator;
    
    public class prova {
    	public static void main(String[] args) {
    		java.util.List<myBean> lista=pack.utils.listaTutteTasse();
    		System.out.println(	"La lista contiene "+lista.size()+" elementi!" );
    
    		Iterator<myBean> iter = lista.iterator();
    
    		while(iter.hasNext()){
    			myBean bean=(myBean)iter.next();
    			System.out.println(bean.getSomma()+" "+bean.getProvincia());
    		}
    	}
    }
    Da questo main viene lanciata un eccezione sull'istruzione di casting
    myBean bean=(myBean)iter.next();
    l'output della console di Eclipse
    codice:
    Hibernate: select TAX_PROV,TAX_IMPO FROM TBL_BIDOTAX
    La lista contiene 7 elementi!
    Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to pack.myBean
    	at pack.prova.main(prova.java:14)
    Da sottolineare che nn posto il file "hibernate.cfg.xml" in quanto effettivamente la select viene
    effettuata e nelle variabili nel debug mi compare anche l'oggetto List con i 7 oggetti contenuti, esattamente contenente i valori del DB!!!

    Avevo pensato a un problema legato al fatto che la tabella non contiene campi dal nome id,
    oppure al fatto che effettivamente io non "riempio" mai l'attributo ID del bean.

    In più ho scritto una semplice prova2.java

    codice:
    package pack;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    public class prova2 {
    
    	public static void main(String[] args) {
    		ArrayList<myBean> lista=new ArrayList<myBean>();
    		List<myBean> listina=null;
    		
    		myBean bean1=new myBean(1234,"n");
    		myBean bean2=new myBean(2345,"na");
    		myBean bean3=new myBean(3456,"nap");
    		myBean bean4=new myBean(4567,"napo");
    		myBean bean5=new myBean(5678,"napol");
    		myBean bean6=new myBean(6789,"napoli");
    		
    		lista.add(bean1);
    		lista.add(bean2);
    		lista.add(bean3);
    		lista.add(bean4);
    		lista.add(bean5);
    		lista.add(bean6);
    		System.out.println(lista.getClass());
    		System.out.println(lista.get(1));
    		
    		listina=lista;
    		System.out.println(listina.getClass());
    		System.out.println(listina.get(1));
    		
    		Iterator<myBean> it=listina.iterator();
    		while (it.hasNext()){
    			myBean bean=(myBean)it.next();
    			System.out.println(bean.getSomma()+" "+bean.getProvincia());
    		}
    	}
    }
    e tutto funziona alla grande...chi mi sa dare un aiuto???
    "

  2. #2
    cambia

    Query q = session.createSQLQuery("select TAX_PROV,TAX_IMPO FROM TBL_BIDOTAX");

    con

    Query q = session.createQuery("from myBean");

    e posta quello che succede

  3. #3
    Grazie per la risposta istantanea
    Io ho provato ma la tabella si chiama TBL_BIDOTAX
    codice:
    Hibernate: select mybean0_.id as id0_, mybean0_.TAX_PROV as TAX2_0_, mybean0_.TAX_IMPO as TAX3_0_ from hibernate.TBL_BIDOTAX mybean0_
    La lista contiene 8 elementi!
    Exception in thread "main" java.lang.NullPointerException
    	at pack.prova.main(prova.java:15)
    Comunque addirittura mettendo solo "FROM TBL_BIDOTAX" come mi hai consigliato dice che la tabella non è mappata
    Altra cosa assurda....

    Per tenervi aggiornati ra ho aggiunto anche il campo ID con un una sequence e la SECONDA funzione dell'insert funziona...non capite per sbaglio che il problema precedente è risolto...ho solo detto che la SECONDA funzione funge
    Il prossimo passo sarà farlo con una tabella senza id e la saranno ca**i amari secondo me...
    "

  4. #4
    Originariamente inviato da SodoMyzer
    Io ho provato ma la tabella si chiama TBL_BIDOTAX
    quella che ti ho dato io è una query HQL, non SQL.
    Siccome te hai mappato TBL_BIDOTAX a myBean puoi fare query HQL sulle classi e hibernate genera il SQL per te,

    "from myBean"

    l'ha trasformata in

    "select mybean0_.id as id0_, mybean0_.TAX_PROV as TAX2_0_, mybean0_.TAX_IMPO as TAX3_0_ from hibernate.TBL_BIDOTAX mybean0_"

    che mi pare corretta, hibernate la esegue e ti costruisce gli oggetti.
    Hibernate si usa così o con le criteria API, la possibilità di fare SQL diretto in genere serve solo se vuoi usare funzionalità specifice del db, e le query SQL non ti ritornano oggetti myBean, ecco perchè ti da ClassCastException quando eseguivi il cast.

    correggi il NullPointerException che ti dà adesso
    codice:
    Exception in thread "main" java.lang.NullPointerException
    	at pack.prova.main(prova.java:15)
    o posta la riga 15 di prova.java se ti serve aiuto

  5. #5
    *edit*

  6. #6
    Aaaaah! scusami!!!
    Allora non avevo capito praticamente niente...
    Nel "FROM TABELLA" in realtà sarebbe un "FROM nomeBean"
    ...o più correttamente "FROM nomePojo"...
    ...maledetta guida
    Ma poi come bisogna estrarre i "myBean" dal List?

    Ok ho praticamente rifatto la query che diventa (ordinandolo per capirci meglio)
    codice:
    Hibernate: select
    mybean0_.id as id0_,
    mybean0_.TAX_PROV as TAX2_0_,
    mybean0_.TAX_IMPO as TAX3_0_
    from hibernate.TBL_BIDOTAX mybean0_
    visto che ho ricreato nattimo la tabella eliminando il campo ID e relativa sequence ovviamente mi esce questo:
    codice:
    19:19:56,062 ERROR JDBCExceptionReporter:72 - ORA-00904: "MYBEAN0_"."ID": identificativo non valido
    Ma la domanda che mi assilla èsempre se non sto approfittando troppo )
    esiste la possibilità di generare un id del pojo senza riferirlo a un campo del DB??
    Oppure si può usare, nel pojo, invece di un attributo "Long" ,
    uno String riferito a un campo VARCHAR2???
    Ora provo

    *edit*
    Ho appena modificato il POJO...ora ha questi attributi
    codice:
    public class myBean {
    	private String id;
    	private int	somma;
    	private String provincia;
    //..relativi getters e setters....
    }
    Il myBean.xml è semplicemente
    codice:
    <hibernate-mapping schema="hibernate" package="pack">
    	<class name="myBean" table="TBL_BIDOTAX" lazy="false">
    	        <id name="id" column="TAX_ANAG"/>
    		<property name="provincia" column="TAX_PROV"/>
    		<property name="somma" column="TAX_IMPO"/>
    	</class>
    </hibernate-mapping>
    e se ho capito bene quindi nel POJO DEVE esserci sempre un campo
    chiamato ID che fa da primary key, e la relativa colonna del DB deve poter
    essere usata come primary key (sempre se la tabella non ne ha una), e cioè
    deve essere univoca e non nulla, giusto???

    Comunque ora funziona, con prova.java la parte dell'Iterator e del cast
    ... non sono sicuro di aver ben capito, ma forse tutto era dovuto a una cattiva gestione del campo id.
    Però cmq non ho capito perchè il cast di prima non mi era permesso...
    Forse perchè io prendevo solo 2 attributi invece di tutti e 3?
    Temo che mi ricapiterà sicuramente più e più volte
    Grazie mille mi sei stato di grande aiuto!
    "

  7. #7
    Ma quale motivo ha la tua tabella per non avere una chiava primaria ?
    Anche se nella tabella non c'è una colonna univoca ne devi mettere una generata dal db (una sequence in oracle), altrimenti puoi inserire due righe uguali e non puoi più distinguerle.
    Casi in cui non c'è bisogno di mettere una chiave primaria sono proprio pochi e non è certo il tuo.

    Il "workaround" per hibernate è mettere tutte le colonne come chiave usando nei mapping "key-property" invece che "property", ma è ok solo se per qualche motivo non puoi modificare lo schema del tuo db.

    Nel tuo pojo la pk non si deve chiamare per forza id, basta che la mappi con il tag id, esempio <id name="unaPrimaryKey" column="TAX_ANAG"/>

    Il cast non ti era permesso perchè usavi session.createSQLQuery(...) , questo bypassa i mapping, esegue la query così comè e ti ritorna un array di object o una mappa non mi ricordo onestamente, cmq non ti ritorna istanze del tuo pojo, hibernate non lo sa cosa vuoi perchè ha saltato i mapping, è simile ad usare JDBC e ricostruirsi poi i pojo a manina.
    Usa session.createQuery con una query HQL invece, o le criteria API che sono comode se non hai una query fissa (esempio hai una schermata di ricerca)

    Ultima cosa ti sconsiglio di imparare hibernate seguendo spezzoni di guide quà e là, ti conviene rimediarti un libro e seguirlo.

  8. #8
    Beh per ora non esiste un motivo per cui la mia tabella non ha campi PK!
    E' che sto convertendo una "vecchia" applicazione JDBC molto semplice per
    fare i primi esercizi!
    Ovvio che non capiterà quasi mai di trovarsi senza PK ma intanto mi sono tolto
    un dubbio ed ho il difetto di intestardirmi a trovare una soluzione quanto più
    vicina a ciò che mi ero prefisso!
    E poi se un giorno ci dovessi lavorare (spero, per questa probabile possibilità)
    e dovessi incorrere in questo tipo di problema, grazie a te conosco già la soluzione!!!

    Grazie ancora!!!
    Sei stato molto chiaro ed esaustivo!!!
    Probabilmente senza il tuo aiuto ci avrei per giorni!!!
    "

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.