# Hibernate Problem



## FelixVogt (7. Dez 2006)

Hallo,

Ich hab hier in einem Studienprojekt ein Problem mit der Implementierung des Persistence Layers in Hibernate.

Unser Problem rührt daher, dass wenn wir ein Objekt ändern wollen, und diese Änderungen speichern wollen, dieses Bereits in der Datenbank vorhanden ist, und wir eine Exception von Hibernate erhalten: 

Duplicate entry 'rtest' for key 2
ERROR - Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
	at org.hibernate.exception.ErrorCodeConverter.convert,,,,,

Wir haben uns mit der Implementierung an ein Tutorial gehalten (event Tutorial ... kennen vielleicht einige
Wir haben folgende Klassen:

Klasse Event:

```
import java.util.Date;

public class Event {
    private String title;
    private String test;
    private Date date;
    private Long id;

    public void setTest(String ctest){
    	test = ctest;
    }
    
    public String getTest(){
    	return test;
    }
    
    private Long getId() {
        return id;
    }

    private void setId(Long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
```
[/code]

Klasse EventManager:

```
import java.util.Date;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class EventManager {

	
	private static Event theEventzu;
	
	public static void main(String[] args) throws java.text.ParseException {
		EventManager instance = new EventManager();
		String title = "rtest";
		Date theDate = new Date();

		List events = instance.listEvents();
			
		theEventzu = (Event) events.get(0);
			
		instance.store(title, theDate);
			
			
		for (int i = 0; i<events.size(); i++) {
			Event theEvent = (Event) events.get(i);
			System.out.println("Event " + theEvent.getTitle() + " Time: " + theEvent.getTest());
		}
		HibernateUtil.closeSession();
	}
	
	private List listEvents() {
		try {
			Session session = HibernateUtil.currentSession();
			Transaction tx = session.beginTransaction();
						
			List result = session.createQuery("from Event").list();			
            
			tx.commit();
			
			return result;
		} catch (HibernateException e) {
			throw new RuntimeException(e.getMessage());
		}
	}		
	
	private void store(String title, Date theDate) {		
		try {
			Session session = HibernateUtil.currentSession();
			Transaction tx = session.beginTransaction();
			
			Event theEvent = new Event();
			theEvent.setTitle(title);
			theEvent.setTest("das ist ein Test");

			session.saveOrUpdate(theEvent);            
            
			tx.commit();
			
		} catch (HibernateException e) {
			e.printStackTrace();
		}
	}
```

Klasse HibernateUtil:

```
import org.hibernate.*;
import org.hibernate.cfg.*;

public class HibernateUtil {

    private static final SessionFactory sessionFactory;

    static {
        try {
            // Create the SessionFactory
            sessionFactory = new Configuration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static final ThreadLocal session = new ThreadLocal();

    public static Session currentSession() throws HibernateException {
        Session s = (Session) session.get();
        // Open a new Session, if this Thread has none yet
        if (s == null) {
            s = sessionFactory.openSession();
            session.set(s);
        }
        return s;
    }

    public static void closeSession() throws HibernateException {
        Session s = (Session) session.get();
        session.set(null);
        if (s != null)
            s.close();
    }
}
```

Mapping Datei:

```
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

        <class name="Event" table="EVENTS">
                <id name="id" column="uid" type="long">
                        <generator class="increment"/>
                </id>
                <property name="title" column="eventtitle" unique="true"/>
                <property name="test" column="test"/>
                
        </class>

</hibernate-mapping>
```


Es wäre total Klasse, wenn mir da jemand weiterhelfen könnte, da ich den Kram bis nächste Woche fertig haben muss.

Vielen Dank schonmal im vorraus.

Gruss
Felix


----------



## kama (7. Dez 2006)

Hi,

schon mal im Forum gesucht?

MfG
Karl Heinz Marbaise


----------



## FelixVogt (8. Dez 2006)

Hallo,

Ich find es echt schade, wenn die Leute immer kategorisch nur auf die Forumsuche verweisen... Ich hab sowohl bei Google als auch in Newsgroups gesucht wie ein blöder. Da werd ich wohl kaum einen Thread erstellen, wenn ich nicht vorher die Suche benutzt habe. Bin alle Artikel im Forum die was mit Hibernate zu tun hatten durchgegangen. 

Die Tutorials die ich gefunden habe (wovon es ja auch nicht gerade wenig gibt) sind auf diese Problematik leider nicht eingegangen, da dort immer einfach nur ein Objekt der zu persitierenden Klasse erstellt wird, und anschliessend mit save() gespeichert wird. Das hilft mir nicht wirklich weiter.

Vielleicht kann mir ja doch noch jemand weiterhelfen.


Mfg
Felix Vogt


----------



## kama (8. Dez 2006)

Hallo,



			
				FelixVogt hat gesagt.:
			
		

> Ich find es echt schade, wenn die Leute immer kategorisch nur auf die Forumsuche verweisen...


Du solltest den Link mal genauer betrachten....Auf die Forumssuche habe ich nicht verwiesen, sondern auf das Hibernate Forum!

MfG
Karl Heinz Marbaise


----------



## SlaterB (8. Dez 2006)

wo steht denn in dem Code was von ändern?
da wird doch ein neues Objekt mit einem anscheinend schon vergebenen Title erzeugt,
das ist verboten,

möchtest du dass Hibernate diesen save-Befehl automatisch in eine Änderung des vorhandenen Eintrags umwandelt?
das wäre ja abenteuerlich


----------



## FelixVogt (8. Dez 2006)

kama hat gesagt.:
			
		

> Du solltest den Link mal genauer betrachten....Auf die Forumssuche habe ich nicht verwiesen, sondern auf das Hibernate Forum!



Muss mich entschuldigen ! Mein Fehler. Hab in meinem Übereifer überlesen, dass das ein verweis auf das hibernate Forum ist.




			
				SlaterB hat gesagt.:
			
		

> wo steht denn in dem Code was von ändern?
> da wird doch ein neues Objekt mit einem anscheinend schon vergebenen Title erzeugt,
> das ist verboten,
> 
> ...



Hab leider noch nicht wirklich durchdrungen, was du damit meinst.

Ich versuche mal zu skizieren, was in unserer Anwendung so geschehen soll:
-User erstellt in einer GUI ein neuen Eintrag in einer Liste (z.B. einen Event)
-Dieses Objekt will ich nun mittels Hibernate in der Datenbank speichern bzw. bestehnende Objekte ändern können.

Das Problem ist, wenn ich über session.load(Event.class, id) in der Datenbank schaue, gibt es dieses objekt nicht.
Scheint fast so zu sein, als ob diese geschichte nicht in der selben hibernate session ausgeführt wird.

Gruss
Felix


----------

