Guten Morgen,
da ich die ersten Schritte mit Hibernate bereits gemacht habe, stellt sich mir nun die Frage, wie ich die ID/IDs eines Datensatzes auslesen kann. Dabei habe ich ein Objekt Honey beispielsweise, das in der Datenbank aus ID, Name und Taste aufgebaut ist.
Nun will ich beispielsweise ein Objekt aus der DB auslesen, wo ich quasi nur den Geschmack (Taste) kenne. Bei mir in diesem Falle wäre der Taste "sweet".
Das Statement würde also wie folgt aussehen:
Als Lösung in Hibernate dachte ich mir könnte folgender Ansatz sein (der leider fehlerhaft ist):
Da ich HSQL als Datenbank benutze habe ich eine shutdown()-Methode in der Klasse geschrieben, die ich der Übersicht halber hier nicht extra aufführe.
Mein Honey-Objekt sieht wie folgt aus:
Bei Ausführung der Testklasse erhalte ich folgende Fehlermeldung mit der ich leider nicht viel anfangen kann (auf das Wesentliche gekürzt):
Darüber hinaus kann ich bereits das Objekt in die Datenbank speichern und auch anschließend updaten(wofür man auch die ID braucht). Da man die ID schließlich immer brauchen kann um ein Objekt aus der Datenbank zu lesen, wäre um einen Lösungsansatz sehr froh.
Vielleicht bin auch voll auf dem Holzweg mit meinem Ansatz.
da ich die ersten Schritte mit Hibernate bereits gemacht habe, stellt sich mir nun die Frage, wie ich die ID/IDs eines Datensatzes auslesen kann. Dabei habe ich ein Objekt Honey beispielsweise, das in der Datenbank aus ID, Name und Taste aufgebaut ist.
Nun will ich beispielsweise ein Objekt aus der DB auslesen, wo ich quasi nur den Geschmack (Taste) kenne. Bei mir in diesem Falle wäre der Taste "sweet".
Das Statement würde also wie folgt aussehen:
Dabei erhalte ich mehrere IDs mit dem gleichen "Taste".SELECT ID FROM THONEY WHERE TASTE = 'sweet'
Als Lösung in Hibernate dachte ich mir könnte folgender Ansatz sein (der leider fehlerhaft ist):
Code:
package de.laliluna.example;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
/**
* @author laliluna
*
*/
public class TestClient
{
public static void main(String[] args)
{
// [laliluna] create a new object
Honey honey2 = new Honey();
honey2.setTaste("sweet");
getID(honey2);
}
public static Integer getID(Object obj)
{
Session session = null;
Transaction tx = null;
Logger log = Logger.getLogger("TestClient");
log.info("creating honey");
// [laliluna] our returned primary key
Integer id = null;
try
{
// [laliluna] get the session from the factory
session = HibernateSessionFactory.currentSession();
// [laliluna] always start a transaction before doing something
// (even reading) from the database
tx = session.beginTransaction();
System.out.println("---------------------DIE ID LAUTET: "+session.getIdentifier(obj));
session.flush();
// [laliluna] clean up (close the session)
session.close();
HibernateSessionFactory.closeSession();
shutdown();
}
catch(HibernateException ex)
{
ex.printStackTrace();
}
return id;
}
}
Da ich HSQL als Datenbank benutze habe ich eine shutdown()-Methode in der Klasse geschrieben, die ich der Übersicht halber hier nicht extra aufführe.
Mein Honey-Objekt sieht wie folgt aus:
Code:
package de.laliluna.example;
/**
* @author laliluna
*
*/
public class Honey
{
private Integer id;
private String name;
private String taste;
public Honey()
{
}
/**
* @return Returns the id.
*/
public Integer getId()
{
return id;
}
/**
* @param id The id to set.
*/
public void setId(Integer id)
{
this.id = id;
}
/**
* @return Returns the name.
*/
public String getName()
{
return name;
}
/**
* @param name The name to set.
*/
public void setName(String name)
{
this.name = name;
}
/**
* @return Returns the taste.
*/
public String getTaste()
{
return taste;
}
/**
* @param taste The taste to set.
*/
public void setTaste(String taste)
{
this.taste = taste;
}
}
Bei Ausführung der Testklasse erhalte ich folgende Fehlermeldung mit der ich leider nicht viel anfangen kann (auf das Wesentliche gekürzt):
Code:
org.hibernate.TransientObjectException: The instance was not associated with this session
at org.hibernate.impl.SessionImpl.getIdentifier(SessionImpl.java:1308)
at de.laliluna.example.TestClient.getID(TestClient.java:230)
at de.laliluna.example.TestClient.main(TestClient.java:27)
Darüber hinaus kann ich bereits das Objekt in die Datenbank speichern und auch anschließend updaten(wofür man auch die ID braucht). Da man die ID schließlich immer brauchen kann um ein Objekt aus der Datenbank zu lesen, wäre um einen Lösungsansatz sehr froh.
Vielleicht bin auch voll auf dem Holzweg mit meinem Ansatz.