Hibernate Problem

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;
}

Das ist der Ladecode

    System.out.println(new File("hibernate.cfg.xml").exists());
    SessionFactory sessionFactory = new AnnotationConfiguration().configure(new File("hibernate.cfg.xml")).buildSessionFactory();
    Session session = sessionFactory.getCurrentSession();
    try
    {
      session.beginTransaction();
      // Datenbankzugriff über das Session-Objekt
      Hochschule hs = (Hochschule)session.load(Hochschule.class, session);
      session.getTransaction().commit();
    }
    catch(Exception ex)
    {
      session.getTransaction().rollback();
      ex.printStackTrace();
    }
  }

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.

:smiley: kann sein ich sitze erst seit ~3h an Hibernate :smiley:

Ich hab mal nen extrem Simples Eclipse-Projekt von mir exportiert und unten angehängt. Da findeste eigentlich alles, was de brauchst.

Benötigte Hibernate-Libs: EntityManager und core
DB-Anbindung: HSQLDB

Ich mach jetzt erstmal Feierabend, wenn de noch Fragen hast, dann beantwort ich die erst morgen (oder jemand anderes :smiley: ).

Danke werd ich mir nachm Essen ansehen

Und, hats geklappt :smiley: ? 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 hatte gestern noch kurz versucht deins zu starten abe da gabs ne Fehlermeldung :wink:
Gleich gehts weiter mit den Versuchen.

Jop, dann einfach mal Fehlermeldung vertrauensvoll an mich weiterleiten … wär ja gelacht wenn cih mein eigens „Projekt“ nicht zum Laufen bekomen würde :smiley:

Eagle, auf der Webseite von Hibernate gibts doch auch ein Einführungsbeispiel, an dem man alle wichtigen Zusammenhänge erklärt bekommt.

das gibts wenn ich deins starten will

Lex ja aber das war ohne Annotations daher hab ichs nur bisschen angesehen gehabt.

Schaut wohl nach nem ClassDefNotFoundError aus. Hast du die ehcache-JAR aus dem lib Verzeichnis deines Hibernate-Core-Frameworks im Class/Buildpath?

:smiley: das war die Lösung

Wunderbar, dann viel Spaß beim Rumprobieren :slight_smile: .

Du benötigst übrigens folgende Libs in deinem Build-Path:

ejb3-persistence.jar
hibernate-annotations.jar
hibernate-commons-annotations.jar
hibernate3.jar
log4j.jar
anltlr.jar
cglib.jar
commons-collections.jar
commons-logging.jar
dom4j.jar
javassist.jar
jta.jar
asm.jar
hibernate-entitymanager.jar
ehcache.jar

hsqldb.jar falls du ne HSQLDB verwendest.

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 :smiley:

Und dann wird das Objekt mit der angegebenen ID geladen? Cool, wieder was gelernt :slight_smile: .

Ich erweitere mein Beispiel gleich mal …

Ich steh gerade vor dem nächsten Problem, ich hab zwar ne Lösung gefunden aber die mag ich nicht :wink:
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 :wink:

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 :smiley:
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

So, erstmal zu deinem 1. Problem:

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 :wink: .

Wird da nicht die Spalte aus der Datenbank verwendet, weil die heißt hochschul_id?

Jep ich hab die neusten, bin auch mal mit allen Libs auf die 3.3.1 gegangen da war das gleiche Problem.

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 :wink: .