Exception wird nicht aufgefangen

7bkahnt

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

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


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 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:
Hallo,

welche Exception wird dort nur angezeigt, weil sie geloggt wird und welche wird tatsächlich ausgegeben, weil sie nicht abgefangen wird?
Also, wenn die Exceptions in eclipse ausgegeben werden, welche ist rot und welche nicht.

Gruß

Sascha
 
die beiden Methoden befinden sich in unterschiedlichen Klassen.
Die Methode lockCrud() wird in der CrudAction.java aufgerufen und ist mit einem try-catch block umrahmt.

lockdao ist übirgens bei mir so deklariert:
Java:
private LockDAO lockDAO = new LockDAOImpl();
während LockDAO ein Inteface ist.

In der CrudAction wird also mit lockDAO.lockCrud() die Methode aufgerufen.
Diese wirft ja eigentlich eine Exception aus, die ich dann in der CrudAction auffangen will, indem ich FEHLER ausschreibe.
Das passiert allerdings nie.
Stattdessen kommt eben in der Konsole der Text, den ich oben geschrieben hab, wo unter Anderem "threw IllegalStateException" erscheint.
Ich hatte leider noch nicht so viel mit Exceptions am Hut, aber so müsste es doch eigentlich funktionieren oder?
Ich verstehs nich....:-(
 
Zuletzt bearbeitet:
Es sieht so aus, dass die Exception abgefangen wurde und nur geloggt wurde, also auf der Konsole ausgegeben wurde, dann kannst du sie auch nicht anfangen.

Aber bei dieser Exception passt was mit deiner DB bzw mit deinen Daten nicht, die du versuchst in die DB zu schreiben.
Vielleicht solltest du dir das mal anschauen.

Gruß

Sascha
 
Hi,

poste doch mal deine *.hbm.xml-Files oder deine Klassen, falls du Annotations verwendest. Dein Code ist für mich sowieso nicht ganz nachzuvollziehen, warum wird ein crud-Objekt geholt, danach erstellst du ein lock-Objekt, aber wo ist die Verbindung zwischen den beiden?

Grüße,
Peter
 
Genau ich nutze Annotations. Crud ist eine Tabelle, wo ich die Daten rausnehme und Lock ist eine Tabelle, wo ich jeweils die ID des DS und die ID des Nutzer reinschreibe.

Hier ist die Lock-Tabelle:
Java:
package tables;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Version;

import org.hibernate.annotations.OptimisticLockType;
import org.hibernate.annotations.PolymorphismType;


@Entity
@Table(name="Lock_t")

public class Lock {
	
	private Integer id;
	private Integer id_sb;
	private String zeit;

	
	public Lock() {
	}
	
	@Id
	@Column(name="ID")
	public  Integer getId() {
		return id;
	}
	public  void setId(Integer id) {
		this.id = id;
	}
	
	@Column(name="ID_SB")
	public Integer getId_sb() {
		return id_sb;
	}
	public void setId_sb(Integer id_sb) {
		this.id_sb = id_sb;
	}
	
	@Column(name="DAT")
	public String Zeit() {
		return zeit;
	}
	public void setZeit(String zeit) {
		this.zeit = zeit;
	}
}

komplette CrudAction:
Java:
package actions;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import dao.CrudDAO;
import dao.CrudDAOImpl;
import dao.LockDAO;
import dao.LockDAOImpl;
import tables.Crud;
import tables.User;

public class CrudAction extends ActionSupport implements ModelDriven<Crud>,SessionAware{

	private static final long serialVersionUID = -6659925652584240539L;

	private Crud crud = new Crud();
	private List<Crud> crudList = new ArrayList<Crud>();
	private CrudDAO crudDAO = new CrudDAOImpl();
	private LockDAO lockDAO = new LockDAOImpl();
	private Map<String, Object> session;  
	
	
	@Override
	public Crud getModel() {
		return crud;
	}
	
	
	public String save()
	{	
		 Integer userid=(Integer)session.get("userObject");
         crudDAO.saveCrud(crud,userid);
         
		return SUCCESS;
	}
	
	public String Update()
	{
		Integer userid=(Integer)session.get("userObject");
//		HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
//		lockDAO.deletelockCrud(Integer.parseInt(request.getParameter("id")),userid);
		crudDAO.UpdateCrud(crud,userid);
		return SUCCESS;
	}
	
	
	
	public String delete()
	{
		HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
		boolean checkeintrag=lockDAO.checklock(Integer.parseInt(request.getParameter("id"))); 
		
		if(checkeintrag==false){
			crudDAO.deleteCrud(Long.parseLong(request.getParameter("id")));
			return SUCCESS;
		}
		else{
			return "noedit";
		}
	}
	
	
	
	public String deletelock()
	{
		Integer userid=(Integer)session.get("userObject");
		HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
		Integer auswahlid=(Integer) session.get("auswahlid");
		
		lockDAO.deletelockCrud(auswahlid,userid);
		return SUCCESS;
	}
	
	
	
	public String edit()
	{
		Integer userid=(Integer)session.get("userObject");   
		HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
		Integer auswahlid=Integer.parseInt(request.getParameter("id"));
		session.put("auswahlid", auswahlid);
		
		//gewähltes Objekt holen
		crud = crudDAO.listCrudById(Long.parseLong(request.getParameter("id")));
		
		//DS sperren
		boolean checkeintrag=false;
		try {
			checkeintrag=lockDAO.lockCrud(Integer.parseInt(request.getParameter("id")),userid); 
		} catch (Exception e) {
			System.out.println("FEHLER");
			return "Fehler";
			}
		
		//wenn DS nicht gelockt
		if(checkeintrag==true){
			return SUCCESS;
		}
		else{
			return "noedit";
		}
	}
	
	
	
	public String list()
	{
		crudList = crudDAO.listCrud();
		return SUCCESS;
	}
	
	
	
	public String hinzu()
	{
		return SUCCESS;
	}
	
	
	
	
	
	
	//getter und setter
	public Crud getCrud() {
		return crud;
	}

	public void setCrud(Crud crud) {
		this.crud = crud;
	}

	public List<Crud> getCrudList() {
		return crudList;
	}

	public void setCrudList(List<Crud> crudList) {
		this.crudList = crudList;
	}
	
	public LockDAO getLockDAO() {
		return lockDAO;
	}
	public void setLockDAO(LockDAO lockDAO) {
		this.lockDAO = lockDAO;
	}
	
	  @Override
	    public void setSession(Map<String, Object> session) {
	        this.session = session;
	    }
}


LockDAOImpl:
Java:
package dao;

import java.text.DateFormat;
import java.util.Calendar;
import java.util.List;

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

import com.googlecode.s2hibernate.struts2.plugin.annotations.SessionTarget;
import com.googlecode.s2hibernate.struts2.plugin.annotations.TransactionTarget;

import tables.Lock;

public class LockDAOImpl implements LockDAO{
	
	@SessionTarget
	Session session;
	
	@TransactionTarget
	Transaction transaction;
	
	private Integer buser;
	
	@Override
	public boolean checklock(Integer auswahlid) 
	{
		boolean checkeintrag=false;
		try {
				String statement = "select lock.id_sb from Lock lock where lock.id=?";
				List list = (List) session.createQuery(statement).setInteger(0, auswahlid).list();
				buser=(Integer) list.get(0);
				if(list.size()==0){
						checkeintrag=false;
				}
				else{checkeintrag=true;}
		    
		} catch (Exception e) {
			System.out.println("Fehler in lockCrud()");
			e.printStackTrace();
		}
		    return checkeintrag;
	}
	
	
	@Override
	public boolean lockCrud(Integer auswahlid,Integer userid) throws Exception
	{
		System.out.println("lockCrud()");
		
		Lock lock = new Lock();
		boolean checkeintrag=false;
		
		Calendar cal = Calendar.getInstance();
		DateFormat df = DateFormat.getDateTimeInstance();
		String zeit=df.format(cal.getTime());
		
		
			String statement = "select lock.id_sb from Lock lock where lock.id=?";
		    List list = (List) session.createQuery(statement).setInteger(0, auswahlid).list();
		
		 if(list.size()==0){
			lock.setId(auswahlid);
			lock.setZeit(zeit);
			lock.setId_sb(userid);
			session.save(lock);	
			checkeintrag=true;
		}
		else{
			buser=(Integer) list.get(0);
			checkeintrag=false;
		}
		return checkeintrag;
	}
	
	
	@Override
	public void deletelockCrud(Integer auswahlid,Integer userid)
	{
		System.out.println("deletelockCrud()");
		Lock lock = new Lock();
		
		
		try {
		    lock.setId(auswahlid);
		    lock.setId_sb(userid);
			session.delete(lock);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	
	//getter und setter
	public Integer getBuser() {
		return buser;
	}
	public void setBuser(Integer buser) {
		this.buser = buser;
	}
}
 
Zuletzt bearbeitet:
Zurück