Hallo,
ich habe eine webbasierte Anwendung, welche ein Tabelle aus einer DB ausliest und dem Benutzer anzeigt. Dieser kann dann Datensätze z.B. bearbeiten.
Er klickt auf bearbeiten und bekommt den gewählten DS zu Gesicht. Dann nimmt er Änderungen vor und klickt auf Ändern. Somit wird der DS geupdatet.
Nun zu meinem Problem.
Ich möchte dem Problem, dass zwei oder mehrere Nutzer den gleichen DS bearbeiten können, aus dem Weg gehen.
Ersteinmal der Quellcode:
CrudAction.java:
lockdao ist bei mir so deklariert:
während LockDAO ein Inteface ist.
Er geht also mit lockDAO.lockCrud() in die Klasse LockDAOImpl und führt dort die lockCrud() aus.
CrudDAOImpl.java:
Wenn Nutzer A also Bearbeiten klickt, geht er in die edit()-Methode, welche lockCrud() aufruft.
Dort wird die ID des Nutzers, sowie die ID des ausgewählten Datensatzes in eine Lock-Tabelle geschrieben. Die Spalte "ID", in welche die ID´s der Datensätze kommen ist Unique.
Wenn jetzt also Nutzer B ebenfalls den gleichen DS bearbeiten will, klickt er auf Bearbeiten und geht wiederum in die lockCrud().
Dort versucht er wieder in die Tabelle einen Eintrag zu machen. Da aber die ID des Datensatzes schon vorhanden ist kommt es nun zur Exception.
Diese soll geworfen werden und die edit()-Methode soll die Exception auffangen. Im catch-Block soll dann eine Methode aufgerufen werden, welche dem Nutzer den Hinweis gibt, dass der DS gerade bearbeitet wird.
Aber irgendwie geht er nie in den catch-Block rein und schreibt mir somit auch nie FFEEHHLER aus
Habt ihr vielleicht einen Tipp woran das liegen könnte?.
Der Fehler der in der console ausgeschrieben wird:
Ich hatte es auch mit mehreren Exceptions probiert, wie IOException oder auch die IllegalStateException, die ja laut Fehlermeldung (s. oben) sogar geworfen wird.
Aber irgendwie lässt sich nichts abfangen.
ich habe eine webbasierte Anwendung, welche ein Tabelle aus einer DB ausliest und dem Benutzer anzeigt. Dieser kann dann Datensätze z.B. bearbeiten.
Er klickt auf bearbeiten und bekommt den gewählten DS zu Gesicht. Dann nimmt er Änderungen vor und klickt auf Ändern. Somit wird der DS geupdatet.
Nun zu meinem Problem.
Ich möchte dem Problem, dass zwei oder mehrere Nutzer den gleichen DS bearbeiten können, aus dem Weg gehen.
Ersteinmal der Quellcode:
CrudAction.java:
Java:
public String edit()
{
Integer userid=(Integer)session.get("userObject");
HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
crud = crudDAO.listCrudById(Long.parseLong(request.getParameter("id")));
try {
lockDAO.lockCrud(Long.parseLong(request.getParameter("id")),userid);
} catch (Exception e) {
System.out.println("FEEHLER");
}
return SUCCESS;
}
lockdao ist bei mir so deklariert:
Java:
private LockDAO lockDAO = new LockDAOImpl();
Er geht also mit lockDAO.lockCrud() in die Klasse LockDAOImpl und führt dort die lockCrud() aus.
CrudDAOImpl.java:
Java:
@Override
public void lockCrud(Long auswahlid,Integer userid) throws Exception {
Lock lock = new Lock();
System.out.println("lockCrud()");
Calendar cal = Calendar.getInstance();
DateFormat df = DateFormat.getDateTimeInstance();
String zeit=df.format(cal.getTime());
System.out.println(zeit);
lock.setId(auswahlid);
lock.setZeit(zeit);
lock.setId_sb(userid);
session.save(lock);
}
Wenn Nutzer A also Bearbeiten klickt, geht er in die edit()-Methode, welche lockCrud() aufruft.
Dort wird die ID des Nutzers, sowie die ID des ausgewählten Datensatzes in eine Lock-Tabelle geschrieben. Die Spalte "ID", in welche die ID´s der Datensätze kommen ist Unique.
Wenn jetzt also Nutzer B ebenfalls den gleichen DS bearbeiten will, klickt er auf Bearbeiten und geht wiederum in die lockCrud().
Dort versucht er wieder in die Tabelle einen Eintrag zu machen. Da aber die ID des Datensatzes schon vorhanden ist kommt es nun zur Exception.
Diese soll geworfen werden und die edit()-Methode soll die Exception auffangen. Im catch-Block soll dann eine Methode aufgerufen werden, welche dem Nutzer den Hinweis gibt, dass der DS gerade bearbeitet wird.
Aber irgendwie geht er nie in den catch-Block rein und schreibt mir somit auch nie FFEEHHLER aus
Habt ihr vielleicht einen Tipp woran das liegen könnte?.
Der Fehler der in der console ausgeschrieben wird:
Java:
Hibernate: insert into Lock_t (ID_SB, ID) values (?, ?)
Error! Please, check your JDBC/JDNI Configurations and Database Server avaliability.
Could not commit the Hibernate Transaction: Could not execute JDBC batch update
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
Caused by: java.sql.BatchUpdateException: ORA-00001: Unique Constraint (SYSTEM.LOCK_T_UK2) verletzt
org.apache.catalina.core.StandardWrapperValve invoke
SCHWERWIEGEND: Servlet.service() for servlet default threw exception
java.lang.IllegalStateException
Ich hatte es auch mit mehreren Exceptions probiert, wie IOException oder auch die IllegalStateException, die ja laut Fehlermeldung (s. oben) sogar geworfen wird.
Aber irgendwie lässt sich nichts abfangen.
Zuletzt bearbeitet: