Hi,
ich hab mal wieder ein kleines Problem. Nach schweren Kämpfen mit nicht vorhandenen Klassen „läuft“ mein Testprogramm mit Hibernate.
Sobald ich eine Klasse lade gibts diese Meldung
org.hibernate.TypeMismatchException: Provided id of the wrong type for class net.byte_welt.hibernatetest.Hochschule. Expected: class java.lang.Integer, got class $Proxy9
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:109)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:905)
at org.hibernate.impl.SessionImpl.load(SessionImpl.java:822)
at org.hibernate.impl.SessionImpl.load(SessionImpl.java:815)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:342)
at $Proxy9.load(Unknown Source)
at net.byte_welt.hibernatetest.Hibernatetest.main(Hibernatetest.java:31)
Das ist die Klasse die geladen werden soll
@Entity
@Table(name="hochschule")
public class Hochschule
{
@Id
@GeneratedValue
private int id;
@Type(type = "text")
private String name;
@Embedded
private Adresse adresse;
}
Ich arbeite jetzt auch erst seit ein paar Tagen mit JPA/Hibernate. Aber was meinst du mit “Klasse laden”? Wenn du Daten abfragen möchtest, macht man das imho über den EntityManager.
Und, hats geklappt ? War gestern weng aufn Sprung, und wollt eigentlich noch anmerken, dass da noch die Implentierung von nem WebService mit drin is. Wenn du nur Hibernate testen willst, kannst du alles, wo @XmlBlub steht, rauschlöschen (also nur die Annotations). Und das Package mitsamt Klassen „de.stkiese.many2many.ws“ benötigst du auch nicht.
Ich hab gerade nochmal in die Anleitung von Hibernate gesehen und da ist mir aufgefallen das ich mit meinem 1. Versuch garnicht so falsch war, ich hätte nur statt der Sesseion eine ID übergeben müssen
Ich steh gerade vor dem nächsten Problem, ich hab zwar ne Lösung gefunden aber die mag ich nicht
Ich hab ein paar Klassen, alle haben sie einen Verweis auf die Hochschule, nur beim Fachbereich meckert Hibernate mit der Meldung da unten. Ändere ich den Namen der Hochschulvariable in dem Fachbereich ab gehts.
Habt ihr dafür eine Erklärung und eine schönere Lösung? Weil ich hab keine Lust meine Klassen anzupassen nur damit es Hibernate gefällt
Entity
@Table(name = "fachbereich")
public class Fachbereich
{
@Id
@GeneratedValue
private int id;
@OneToOne
@JoinTable(name = "hochschule", joinColumns = {@JoinColumn(name = "hochschule_id")})
private Hochschule hochschule;
@Column
private String name;
}```
```@Entity
@Table(name = "hochschule")
// @NamedQueries({@NamedQuery(name = Hochschule.GET_ALL_HS, query =
// "SELECT h FROM hochschule h ORDER BY name"),})
public class Hochschule
{
public static final String GET_ALL_HS = "net.byte_welt.hibernatetest.Hochschule#getALL";
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column
private String name;
@OneToOne
@JoinTable(name = "HochschulAdresse", joinColumns = {@JoinColumn(name = "adresse")}, inverseJoinColumns = {@JoinColumn(name = "id")})
// @Embedded
private Adresse adresse;```
Ein Nachtrag und ein weiteres Problem
Nachtrag: Statt load sollte man glaube get nehmen um ein Objekt zu laden weil dann bekommt man null wenn es nicht vorhanden ist und es ist kein Proxyobjekt (Nachdem was ich bisher gesehen hab)
Neues Problem: Will ich etwas abspeichern bekomm ich die Meldung, auch wenn ich deine Bücher einfügen will
Du sagst dem Fachbereich, dass er auf die Hochschule joinen soll - und zwar auf die Spalte „hochschule_id“. Ich sehe aber nirgendwo, dass du eine Spalte hast, die du auch „hochschule_id“ genannt hast. IMHO (wie gesagt, auch Anfänger), müsstest du da nur „id“ schreiben.
Problem 2):
Öhm, alle jars auf dem aktuellsten Stand? Er findet ja ne Methode nicht, evtl. ist die in deinem jar (noch) nicht (mehr) enthalten?
Wenn du magst, kann ich am Montag auch mal ne n bissal neuere Version von meinem Beispiel hochladen - ich erweitere das nämlich auch ab und an ein bisschen .
hochschul_id oder hochschule_id? Machst du Reverse-Engineering? Falls nicht, wo gibst du an, dass die ID in der DB „hochschule_id“ heißen soll? Mapped er das automatisch? Weil ich verseh die Felder meistens mit nem @Column(name=„nameInDB“) - dann bin ich auf der sicheren Seite.
Problem 2: Poste mal alle eingebunden Libs mit Versionsnummer (soweit vorhanden). Weil bei mir gehts definitiv .