Ich habe eine Web-App, die Sachen aus einer Datenbank einfügt und löscht. Das ist mein db, mit dem Namen "Shine":Hibernate fügt eine Tabellenzeile ein, löscht sie aber nicht
In SDPLines.java
package entities;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name = "sdplines", catalog = "shine")
public class SDPLines implements java.io.Serializable {
@Id
@GeneratedValue
private int id;
@Column(name="value")
private String value;
@Column(name="session_id")
private String SessionId;
@ManyToOne
@JoinColumn(name="u_id")
private Utente utente;
public SDPLines() {
}
public SDPLines(String value) {
this.value=value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public Utente getUtente() {
return utente;
}
public void setUtente(Utente utente) {
this.utente = utente;
}
public String getSessionId() {
return SessionId;
}
public void setSessionId(String sessionId) {
SessionId = sessionId;
}
In Utente.java
package entities;
import java.util.Set;
// Generated 17-mar-2016 19.34.01 by Hibernate Tools 3.4.0.CR1
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
/**
* Utente generated by hbm2java
*/
@Entity
@Table(name = "utente", catalog = "shine")
public class Utente implements java.io.Serializable {
@Id
@GeneratedValue (strategy = GenerationType.AUTO)
@Column(name = "ID", unique = true, nullable = false)
private long id;
private String username;
private String nome;
private String cognome;
private String password;
@OneToMany(mappedBy="utente")
private Set<SDPLines> sdp;
public Utente() {
}
public Utente(String username) {
this.username = username;
}
public Utente(String username, String nome, String cognome, String password) {
this.username = username;
this.nome = nome;
this.cognome = cognome;
this.password = password;
}
@Column(name = "username", unique = true, nullable = false, length = 10)
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
@Column(name = "nome", length = 45)
public String getNome() {
return this.nome;
}
public void setNome(String nome) {
this.nome = nome;
}
@Column(name = "cognome", length = 45)
public String getCognome() {
return this.cognome;
}
public void setCognome(String cognome) {
this.cognome = cognome;
}
@Column(name = "password", length = 45)
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@OneToMany(mappedBy="utente")
public Set<SDPLines> getSdp() {
return sdp;
}
public void setSdp(Set<SDPLines> sdp) {
this.sdp = sdp;
}
}
dieses:
CREATE TABLE utente (
ID int NOT NULL AUTO_INCREMENT,
nome VARCHAR(255),
cognome VARCHAR(255),
username VARCHAR(255),
password VARCHAR(255),
PRIMARY KEY (ID)
);
CREATE TABLE sdplines (
ID int NOT NULL AUTO_INCREMENT,
value VARCHAR(255),
session_id VARCHAR(255),
u_id int,
PRIMARY KEY (ID),
FOREIGN KEY (u_id) REFERENCES utente(ID)
);
sind meine Entitäten ist SDPLineModel.java, die Entitäten verwaltet:
package model;
import org.hibernate.Query;
import entities.SDPLines;
import entities.Utente;
public class SDPLineModel extends AbstractModel {
public SDPLineModel(){
super (Utente.class);
}
public SDPLines findFingerprint(String fingerprint, Long u_id){
try{
if(!sessionFactory.getCurrentSession().getTransaction().isActive())
sessionFactory.getCurrentSession().getTransaction().begin();
Query q= this.sessionFactory.getCurrentSession().createQuery("select fing from SDPLines fing where fing.value=:valore and fing.utente.id=:id");
q.setString("valore", fingerprint);
q.setLong("id",u_id);
System.out.println("eseguo la query. Valore nel DB: "+fingerprint);
System.out.println("Fingerprint relativa a id"+u_id);
return (SDPLines) q.uniqueResult();
}catch(Exception e){
e.printStackTrace();
return null;
}
}
public SDPLines loginUsername(String username){
try{
if(!sessionFactory.getCurrentSession().getTransaction().isActive())
sessionFactory.getCurrentSession().getTransaction().begin();
Query q= this.sessionFactory.getCurrentSession().createQuery("select ut from Utente ut where ut.username=:username");
q.setString("username", username);
System.out.println("eseguo la query. Valore nel DB: "+username);
return (SDPLines) q.uniqueResult();
}catch(Exception e){
e.printStackTrace();
return null;
}
}
public SDPLines findFingerprintNew(String fingerprint, Long user_id) {
try{
if(!sessionFactory.getCurrentSession().getTransaction().isActive())
sessionFactory.getCurrentSession().getTransaction().begin();
Query q= this.sessionFactory.getCurrentSession().createQuery("select fing from SDPLines fing where fing.value=:valore and fing.utente.id=:id");
q.setString("valore", fingerprint);
q.setLong("id",user_id);
System.out.println("eseguo la query:fingerprint= "+fingerprint);
System.out.println("Fingerprint relativa a id= "+user_id);
return (SDPLines) q.uniqueResult();
}catch(Exception e){
e.printStackTrace();
return null;
}
}
public SDPLines findFingerprintFinal(String fingerprint, String sessionid) {
try{
if(!sessionFactory.getCurrentSession().getTransaction().isActive())
sessionFactory.getCurrentSession().getTransaction().begin();
Query q= this.sessionFactory.getCurrentSession().createQuery("select fing from SDPLines fing where fing.value=:valore and fing.SessionId=:id");
q.setString("valore", fingerprint);
q.setString("id",sessionid);
System.out.println("eseguo la query:fingerprint= "+fingerprint);
System.out.println("Fingerprint relativa a id= "+sessionid);
return (SDPLines) q.uniqueResult();
}catch(Exception e){
e.printStackTrace();
return null;
}
}
public void deleteFingerprint(String fingerprint, String sessionid) {
try{
if(!sessionFactory.getCurrentSession().getTransaction().isActive())
sessionFactory.getCurrentSession().getTransaction().begin();
// Query q= this.sessionFactory.getCurrentSession().createQuery("delete fing from SDPLines fing where fing.value=:valore and fing.SessionId=:id");
Query q= this.sessionFactory.getCurrentSession().createQuery("delete SDPLines where value=:valore and SessionId=:id");
q.setString("valore", fingerprint);
q.setString("id",sessionid);
System.out.println("eseguo la query: DELETE fingerprint= "+fingerprint);
System.out.println("Fingerprint relativa a id= "+sessionid+" DELETED");
}catch(Exception e){
e.printStackTrace();
}
}
Ich habe ein Servlet, das zwischen Einfügen und Löschen einer bestimmten "sdplines" -Zeile basierend auf "session_id" und "value" SDPLine-Werten wechselt.
Mein Problem ist das folgende: Dieses Servlet funktioniert gut, wenn ich in meine MySQL-Datenbank eine neue sdplines-Zeile speichern möchte, wenn ich via Browser seine Session-ID und seinen Wert setze. Aber wenn ich eine sdplines-Zeile löschen will (immer von seinem session_id und value starten), löscht das Verwenden von hibernate es nicht. Ich habe einfach "auswählen" in meine Abfrage "löschen" ersetzt.
Dies ist das Servlet:
package controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import entities.SDPLines;
import entities.Utente;
import model.HibernateUtil;
import model.SDPLineModel;
import model.UtenteModel;
/**
* Servlet implementation class AccountController
*/
@WebServlet("/AccountController")
public class AccountController extends HttpServlet {
private static final long serialVersionUID = 1L;
private UtenteModel um= new UtenteModel();
public AccountController() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String action= request.getParameter("action");
if(action==null){
request.getRequestDispatcher("menu.html").forward(request, response);
}else
{
if(action.equalsIgnoreCase("logout")){
HttpSession session= request.getSession();
session.removeAttribute("username");
response.sendRedirect("AccountController");
}
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String action= request.getParameter("action");
UtenteModel um= new UtenteModel();
SDPLineModel sdpmodel= new SDPLineModel();
if (action.equals("InsertSDPLine")) {
HttpSession session1= request.getSession();
// String username = (String) session1.getAttribute("username");
// String password = (String) session1.getAttribute("password");
// Utente ut= um.loginUsername(username);
Long user_id = (Long) session1.getAttribute("user_id");
// Utente ut = um.login(username, password);
Utente ut = um.loginByID(user_id);
Long u_id = ut.getId();
SessionFactory sf = HibernateUtil.createSessionFactory();
Session session = sf.openSession();
session.beginTransaction();
SDPLines sdp = new SDPLines(request.getParameter("sdpline"));
sdp.setSessionId(request.getParameter("sessionid"));
sdp.setUtente(ut);
session.save(sdp);
session.getTransaction().commit();
session.close();
String message = "INSERTED";
// response.addHeader("FINGERPRINT_VALIDITY", message);
System.out.println("sdpline: "+sdp+"inserita!");
response.getOutputStream().print(message);
response.getOutputStream().flush();
response.getOutputStream().close();
}
if (action.equals("CheckFingerprint")) {
// HttpSession session1= request.getSession();
// String username = (String) request.getParameter("username");
String fingerprint = (String) request.getParameter("fingerprint");
String sessionid = (String) request.getParameter("sessionid");
//String user_id = request.getParameter("user_id");
// HttpSession session1= request.getSession();
// Long user_id = (Long) session1.getAttribute("user_id");
// Utente ut = um.loginByID(user_id);
// Utente ut= um.loginUsername(username);
// Utente ut = um.login(username, password);
// Long u_id = ut.getId();
// SDPLines sdpline = sdpmodel.findFingerprint(fingerprint, user_id);
// SDPLines sdpline = sdpmodel.findFingerprintNew(fingerprint, user_id);
SDPLines sdpline = sdpmodel.findFingerprintFinal(fingerprint, sessionid);
if (sdpline == null) {
String message = "NOT_VALID";
// response.addHeader("FINGERPRINT_VALIDITY", message);
System.out.println("Fingerprint NON trovata! ");
response.getOutputStream().print(message);
response.getOutputStream().flush();
response.getOutputStream().close();
// request.getRequestDispatcher("AfterLogin.jsp").forward(request, response); // va nella pagina welcome
}
else {
String message = "VALID";
System.out.println("Fingerprint trovata! ");
response.getOutputStream().print(message);
response.getOutputStream().flush();
response.getOutputStream().close();
}
}
if (action.equals("DeleteFingerprint")) {
// HttpSession session1= request.getSession();
// String username = (String) request.getParameter("username");
String fingerprint = (String) request.getParameter("sdpline");
String sessionid = (String) request.getParameter("sessionid");
//String user_id = request.getParameter("user_id");
// HttpSession session1= request.getSession();
// Long user_id = (Long) session1.getAttribute("user_id");
// Utente ut = um.loginByID(user_id);
// Utente ut= um.loginUsername(username);
// Utente ut = um.login(username, password);
// Long u_id = ut.getId();
// SDPLines sdpline = sdpmodel.findFingerprint(fingerprint, user_id);
// SDPLines sdpline = sdpmodel.findFingerprintNew(fingerprint, user_id);
SDPLines sdpline = sdpmodel.findFingerprintFinal(fingerprint, sessionid);
if (sdpline == null) {
String message = "FINGEPRINT_NOT_PRESENT!";
// response.addHeader("FINGERPRINT_VALIDITY", message);
System.out.println("DELETE FINGEPRINT: FINGERPRINT NON PRESENTE! ");
response.getOutputStream().print(message);
response.getOutputStream().flush();
response.getOutputStream().close();
// request.getRequestDispatcher("AfterLogin.jsp").forward(request, response); // va nella pagina welcome
}
else {
sdpmodel.deleteFingerprint(fingerprint, sessionid);
String message = "DELETED";
System.out.println("Fingerprint rimossa! ");
response.getOutputStream().print(message);
response.getOutputStream().flush();
response.getOutputStream().close();
}
}
if(action.equals("loginUt")){
Utente ut= um.login(request.getParameter("username"), request.getParameter("password"));
if(ut==null){
request.setAttribute("message","Account Invalido");
request.getRequestDispatcher("loginUtente.jsp").forward(request, response); // rimane nella pagina della form
}else
{
HttpSession session= request.getSession();
session.setAttribute("username",request.getParameter("username"));
session.setAttribute("password",request.getParameter("password"));
session.setAttribute("user_id",ut.getId());
request.setAttribute("username",request.getParameter("username"));
// request.getRequestDispatcher("welcomeUtente.jsp").forward(request, response); // va nella pagina welcome
request.getRequestDispatcher("AfterLogin.jsp").forward(request, response); // va nella pagina welcome
}
}else
{
if(action.equals("registra")){
Utente ut= new Utente();
//prelevo valori dalla form e li scrivo nel DB
ut.setNome(request.getParameter("nome"));
ut.setCognome(request.getParameter("cognome"));
ut.setUsername(request.getParameter("username"));
ut.setPassword(request.getParameter("password"));
String password=request.getParameter("RepeatPassword");
//registrazione nuovo utente
this.um.create(ut);
request.getRequestDispatcher("loginUtente.jsp").forward(request, response);
}
}
}
}
Dies ist hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password"></property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/shine</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="show_sql">true</property>
<mapping class="entities.SDPLines"/>
<mapping class="entities.Utente"/>
</session-factory>
</hibernate-configuration>
Es funktioniert, danke! Nur ein Detail: ich muss "session" durch "this.sessionFactory.getCurrentSession()" ersetzen :-) – pier92