[JSP / Hibernate] Gleiche Tabelle in verschiedenen Portlets - mal gehts, mal nicht?!

silmepurpurdrache

Grünschnabel
Hallo, ich bins nochmal.

Ich habe zwei Portlets, die beide Einträge in Tabelle ToDoList eingeben. Das eine Portlet (Raumreservierung) soll einfach nur einen bestimmten Eintrag in die Tabelle schreiben, das andere (Aufgabenliste) soll die entsprechende Tabelle ausgeben, Eingaben und Änderungen sowie Löschungen bereithalten.

Sobald eine Raumreservierung gespeichert wird, wird ein Eintrag in die ToDoList geschrieben:

Code:
		ThemeDisplay themeDisplay = (ThemeDisplay)req.getAttribute(WebKeys.THEME_DISPLAY);
		String group_id = String.valueOf(themeDisplay.getPortletGroupId());
		String user_id = req.getRemoteUser();
		Date date = new Date(calStart.getTimeInMillis());
		String desc = "Bitte genehmigen Sie folgende Reservierung: " + eef.getPurpose();
		ToDoList todo = new ToDoList("Neue Reservierung", desc, null, "",
				date, "0", null, group_id, user_id);
		DatabaseManager.addToDoList(todo);
ToDoList wird folgendermaßen definiert:

Code:
public ToDoList(String title, String description, Set resp_id, String extresp, Date enddate,
			String executiongrade, Set history, String groupId, String userId) {...}

Das Speichern funktioniert ganz einfach:

Code:
	public static void addToDoList(ToDoList todo) throws Exception {
		Session session = null;

		try {
			session = HibernateSessionFactory.getSession();

			session.beginTransaction();
			
			session.save(todo);

			session.flush();

			session.getTransaction().commit();
			
		}
		catch (Exception e) {
			throw new Exception(e);
		}
		finally {
			session.disconnect();
		}
	}

Leider ist dieser Ansatz nicht perfekt, da Hibernate versucht, Einträge an Stelle 1 der Tabelle einzusetzen, die womöglich schon von einer anderen Aufgabe belegt ist.

Seltsamerweise bekomme ich oft verschiedene Fehlermeldungen:

org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update

oder

java.sql.SQLException: Can't call commit when autocommit=true

oder auch, was meine Vermutung ausgelöst hat,

java.sql.BatchUpdateException: Duplicate entry '7' for key 1

Wenn ich noch einmal versuche, einen Eintrag zu schreiben, gehts wieder, sofern es keinen Eintrag an Stelle 8 gibt.
Eigentlich sollte er doch eine eigene ID generieren, die frei ist, oder?

Das hier ist mein Mapping:
HTML:
<?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 default-lazy="false" auto-import="false">
	<class name="de.XXX.portlet.raumreservierung.hibernate.ToDoList" table="ToDoList">
		<id name="id" type="int">
			<generator class="increment" />
		</id>
		<property name="title" />
		<property name="description" />
		<property name="extresp"/>
		<property name="enddate" />
		<property name="executiongrade" />
		<property name="group_id" />
		<property name="user_id" />
	<set name="responsibles" table="Responsible" cascade="all">
    	<key column="todo_id"/>
    <one-to-many class="de.XXX.portlet.raumreservierung.hibernate.Responsible" />
    </set>
		<set name="history" table="History" cascade="all">
    	<key column="todo_id"/>
    	<one-to-many class="de.XXX.portlet.raumreservierung.hibernate.History" />
	</set>
	</class>
</hibernate-mapping>

Liegt es daran, dass ich in dem anderen Portlet auch ein solches Mapping habe? Gibt es eine andere Möglichkeit? Ich bin am Verzweifeln ....
 

Neue Beiträge

Zurück