PDA

View Full Version : [Java] [Hibernate] - Errore di casting?!!!


nucce
02-04-2008, 18:07
salve a tutti...sto usando Hibernate (versione 3.2) per un progetto, sto cercando di mappare il database ma ho un paio di problemi...le tabelle che stò cercando di mappare sono le seguenti:



______________ __________
| | | | ___________
| CESSIONE | | LAVORO | | |
|______________| |__________| | CLIENTE |
| | (1,1) | | |___________|
| *IdLavoro | <---> | *Id | (1,1) | |
| Descrizione | | Cliente | <---> | *Id |
|______________| |__________| | Nome |
|___________|



il javabean per la tabella Lavoro:

package beans;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

public class Lavoro {
private int id;
private Date data;
private Set cliente = new HashSet();
public Lavoro(){
super();
}
//Metodi getter
public int getId(){
return id;
}
public Date getData(){
return data;
}
public Set getCliente(){
return cliente;
}
//Metodi setter
public void setId(int id){
this.id = id;
}
public void setData(Date data){
this.data = data;
}
public void setCliente(Set cliente){
this.cliente = cliente;
}
}


Il bean cessione:

package beans;

public class Cessione extends Lavoro{
private int idLavoro;
private String descrizione;

public Cessione(){
super();
}
//Metodi getter
public int getIdLavoro(){
return super.getId();
}

public String getDescrizione(){
return descrizione;
}
//Metodi setter
public void setIdLavoro(int idLavoro){
super.setId(idLavoro);
}
public void setDescrizione(String descrizione){
this.descrizione = descrizione;
}
}


Infine il bean cliente:

package beans;

public class Cliente {

private int id;
private String nome;

public Cliente(){
super();
}

//Metodi getter
public int getId(){
return id;
}

public String getNome(){
return nome;
}
//Metodi setter
public void setId(int id){
this.id = id;
}

public void setNome(String nome){
this.nome = nome;
}
}


Mentre i file xml per il mapping sono:

Lavoro:

<?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>
<class name="beans.Lavoro" table="lavoro">
<id name="id" column="id">
<generator class="identity"/>
</id>

<one-to-one name="cliente" class="beans.Cliente"/>
</class>
</hibernate-mapping>


cessione:

<?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>

<class name="beans.Cessione" table="cessione">
<id name="idLavoro" column="idLavoro">
<generator class="foreign">
<param name="property">idLavoro</param>
</generator>
</id>

<one-to-one name="idLavoro" class="beans.Lavoro" foreign-key="id" constrained="true"/>

<property name="descrizione"/>
</class>

</hibernate-mapping>


Cliente:

<?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>

<class name="beans.Cliente" table="cliente">
<id name="id" column="id">
<generator class="identity"/>
</id>

<property name="nome"/>
</class>

</hibernate-mapping>


L'errore che mi esce, invece, è il seguente:

java.lang.ClassCastException: org.hibernate.type.IntegerType cannot be cast to org.hibernate.type.EntityType
org.hibernate.id.ForeignGenerator.generate(ForeignGenerator.java:50)
org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:99)
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301)
$Proxy0.save(Unknown Source)
test.CessioneTest.doGet(CessioneTest.java:58)
javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)


Non riesco a capire dove è l'errore!!!...c'è per caso qualche errore nei beans?

gokan
02-04-2008, 18:20
Ti do una dritta, usando le annotation dovresti scrivere qualcosa di simile anche per le altre classi.


@Entity
public class Lavoro{
@Id
private int id;
@Temporal(TemporalType.TIMESTAMP)
private Date data;
@OneToOne
private Cliente cliente; //hai detto tu che c'è un rapporto 1-1

//getters e setters
}

Spero di esserti stato un pò utile.

nucce
02-04-2008, 18:26
quindi tu dici di dichiarare l'entità "cliente" in lavoro non come HashSet ma come Cliente?

gokan
02-04-2008, 18:35
Se tu hai deciso che per un lavoro c'è uno ed un solo cliente ok, se invece pensi che c'è ne siano di più utilizza qualcosa come

public class Lavoro{
@OneToMany(mappedBy = "lavoro")
private List<Cliente> clienti; //per un lavoro più clienti
......
}
public class Cliente{
@ManyToOne
private Lavoro lavoro; //per un lavoro più clienti
......
}


Occhio al mappedBy, in questo modo mantieni la bidirezionalità tra Lavoro e Cliente

nucce
02-04-2008, 19:38
ho fatto come hai detto tu...ho dichiarato cliente come "Cliente" e non HashSet ma mi da lo stesso errore!!! :help:

gokan
03-04-2008, 09:39
Le cose che ti ho detto io erano a prescindere dal tuo errore..da qualche parte stai cercando di castare da Intero ad una classe.
Vai in debug mode e controlla dove ottieni l'errore.

nucce
03-04-2008, 15:20
Vai in debug mode e controlla dove ottieni l'errore.

Scusa l'ignoranza ma come si fa ad andare in debug mode :D :ciapet:

gokan
03-04-2008, 15:32
metti un breakpoint sulla possibile riga di codice (o comunque nei paraggi) di errore ed avvia l'applicazione con "Debug On Server".
Se usi Eclipse dovresti notare un bottoncino a forma di scarafaggio :D

TuX2K6
04-04-2008, 08:49
Credo che il tuo problema sia qui
<id name="idLavoro" column="idLavoro">
<generator class="foreign">
<param name="property">idLavoro</param>
</generator>
</id>

<one-to-one name="idLavoro" class="beans.Lavoro" foreign-key="id" constrained="true"/>

Hai detto che l'identificativo della classe lavoro è un entità lavoro e non il suo identificativo, sfortunatamente non ho mai provato a fare una cosa simile e quindi vado ad intuito...

nucce
04-04-2008, 18:33
Credo che il tuo problema sia qui

<id name="idLavoro" column="idLavoro">
<generator class="foreign">
<param name="property">idLavoro</param>
</generator>
</id>

<one-to-one name="idLavoro" class="beans.Lavoro" foreign-key="id" constrained="true"/>

Hai detto che l'identificativo della classe lavoro è un entità lavoro e non il suo identificativo, sfortunatamente non ho mai provato a fare una cosa simile e quindi vado ad intuito...

no scusa non ho capito bene, questo è il mapping file per l'entità cessione dove dico (o meglio dovrei dire) che l'identificativo è idLavoro ed è referenziato all'id della calsse beans.Lavoro...o sbaglio?
Fra l'altro non mi è molto chiaro come funziona il parametro <param name="property">xxxxxxxxx</param> ...non riesco a capire cosa devo mettere (confesso di essere andato un po' a tentativi) e sulla documentazione di hibernate non ho trovato nulla!

nucce
07-04-2008, 09:21
uppettino!!!! :D

nucce
08-04-2008, 17:02
up :sofico: