[SPRING] 봄 + 최대 절전 모드 : 테이블에서 레코드를 삭제할 수 없습니다.
SPRING봄 + 최대 절전 모드 : 테이블에서 레코드를 삭제할 수 없습니다.
Spring 필드에서 꽤 새로 운 것이고, 이번에는 DAO 객체를 만들기 위해 Hibernate와 통합하는 방법을 연구하고 있지만 DELETE 작업에 몇 가지 어려움을 찾고 있습니다 ...
그래서 나는 사람 테이블을 가지고 있으며,이 DAO 객체를 구현하는이 구체적인 클래스를 만들었습니다.
package org.andrea.myexample.HibernateOnSpring.dao;
import java.util.List;
import org.andrea.myexample.HibernateOnSpring.entity.Person;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Transactional;
public class PersonDAOImpl implements PersonDAO {
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
// Metodo che inserisce un nuovo record nella tabella person
@Transactional(readOnly = false)
public void addPerson(Person p) {
Session session = sessionFactory.openSession();
session.save(p);
session.close();
}
/*
* Metodo che recupera un record, rappresentante una persona, avente uno
* specifico id dalla tabella.
*
* @param L'id univoco della persona
*/
public Person getById(int id) {
Session session = sessionFactory.openSession();
try {
return (Person) session.get(Person.class, id);
} finally {
session.close();
}
}
/*
* Metodo che recupera la lista di tutti le persone rappresentanti dalle
* righe della tabella person
*/
@SuppressWarnings("unchecked")
public List<Person> getPersonsList() {
Session session = sessionFactory.openSession();
try {
Criteria criteria = session.createCriteria(Person.class);
return criteria.list();
} finally {
session.close();
}
}
/*
* Metodo che elimina dalla tabella person la riga avente uno specifico id
*
* @param l'id della persona da eliminare dalla tabella person
*/
public void delete(int id) {
Session session = sessionFactory.openSession();
try {
Person personToDelete = getById(id);
session.delete(personToDelete);
} finally {
session.close();
}
}
}
그런 다음 DAO가 어떻게 작동하는지 테스트 할 메인 클래스를 만듭니다. 나는 새 객체를 dable에 삽입하여 단일 객체 또는 테이블의 모든 객체 목록을 가져 오는 데 아무런 문제가 없지만 테이블에서 객체를 삭제할 때 문제가 발생했습니다.
이것은 내 테스트 수업입니다.
package org.andrea.myexample.HibernateOnSpring;
import java.util.List;
import org.andrea.myexample.HibernateOnSpring.dao.PersonDAO;
import org.andrea.myexample.HibernateOnSpring.dao.PersonDAOImpl;
import org.andrea.myexample.HibernateOnSpring.entity.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main( String[] args ){
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
System.out.println("Contesto recuperato: " + context);
Person persona1 = new Person();
persona1.setFirstname("Pippo");
persona1.setLastname("Blabla");
//persona1.setPid(1);
System.out.println("Creato persona1: " + persona1);
PersonDAO dao = (PersonDAO) context.getBean("personDAOImpl");
System.out.println("Creato dao object: " + dao);
dao.addPerson(persona1);
System.out.println("persona1 salvata nel database");
Person personaEstratta = dao.getById(persona1.getPid());
System.out.println("Persona con id: " + personaEstratta.getPid() + " estratta dal DB");
System.out.println("Dati persona estratta:");
System.out.println("Nome: " + personaEstratta.getFirstname());
System.out.println("Cognome: " + personaEstratta.getLastname());
System.out.println("");
// STAMPA LA LISTA DELLE PERSONE NELLA TABELL person:
List<Person> listaPersone = dao.getPersonsList();
System.out.println("Lista delle persone recuperata: " + listaPersone );
// MOSTRA I DATI DI TUTTE LE PERSONE NELLA LISTA:
for(int i=0; i<listaPersone.size(); i++){
Person currentPerson = listaPersone.get(i);
System.out.println("id: " + currentPerson.getPid()
+ " nome: " + currentPerson.getFirstname()
+ " cognome: " + currentPerson.getLastname());
}
// ELIMINAZIONE DI UNA PERSONA DALLA TABELLA person:
System.out.println("");
System.out.println("ELIMINAZIONE DI UNA PERSONA DALLA TABELLA person:");
// ELIMINA TUTTI I RECORD DALLA TABELLA persone:
for(int i=0; i<listaPersone.size(); i++){
dao.delete(listaPersone.get(i).getPid());
System.out.println("Persona con id: " + i + " eliminata");
}
listaPersone = dao.getPersonsList(); // Lista vuota
// MOSTRA I DATI DI TUTTE LE PERSONE NELLA LISTA:
for(int i=0; i<listaPersone.size(); i++){
Person currentPerson = listaPersone.get(i);
System.out.println("id: " + currentPerson.getPid()
+ " nome: " + currentPerson.getFirstname()
+ " cognome: " + currentPerson.getLastname());
}
}
}
이 클래스가 끝나면 다음과 같이 단순히주기를 실행하는 모든 테이블 레코드를 삭제하려고합니다.
dao.delete(listaPersone.get(i).getPid());
하지만 그것은 작동하지 않으며 내 테이블에 모든 기록은 여전히 동일하게 유지됩니다 ...
왜? 내 코드에서 무엇이 잘못 되었습니까? (예외는 아니지만 ...)
이것은 내 Person 클래스 코드입니다.
package org.andrea.myexample.HibernateOnSpring.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="person")
public class Person {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int pid;
private String firstname;
private String lastname;
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
}
해결법
-
==============================
1.나는 이런 문제를 해결했다.
나는 이런 문제를 해결했다.
@Override public void deleteData(int id) { log.info("delete by id = "+id); Transaction tx=null; //open a session and begin the transaction with the database Session session = null; try { session = getSession(); tx = session.beginTransaction(); Person person = getPerson(id); session.delete(person); tx.commit(); } catch (Exception e) { e.printStackTrace(); } finally { if (!tx.wasCommitted()) { tx.rollback(); }//not much doing but a good practice session.flush(); //this is where I think things will start working. session.close(); } }
-
==============================
2.삭제 방법은 어떻게 생겼습니까? @Transaction이 포함되어 있습니까? 그것은 그 예입니다.
삭제 방법은 어떻게 생겼습니까? @Transaction이 포함되어 있습니까? 그것은 그 예입니다.
@Transaction public int deleteUser(String userName) { try { //open a session and begin the transaction with the database sessionFactory = HibernateUtil.getSessionFactory(); Session session = sessionFactory.openSession(); session.beginTransaction(); //query the database Query query = session.createQuery("delete from Users u where u.userName ='" + userName +"'"); int result = query.executeUpdate(); session.close(); return result; }
return 문 앞에 세션을 닫았는지 확인하십시오.
-
==============================
3.귀하의 코드에서 그것은 저장 작동하지만 삭제되지 않는 것 같습니다. 세션이 트랜잭션과 동기화되었다고 가정합니다 (트랜잭션이 완료되기 전에 세션 비우기). @Transactional을 삭제 메소드에 배치하면 효과가 있습니다.
귀하의 코드에서 그것은 저장 작동하지만 삭제되지 않는 것 같습니다. 세션이 트랜잭션과 동기화되었다고 가정합니다 (트랜잭션이 완료되기 전에 세션 비우기). @Transactional을 삭제 메소드에 배치하면 효과가 있습니다.
-
==============================
4.delete 메소드에서 @Transactional이 보이지 않습니까? 너 하나있어?
delete 메소드에서 @Transactional이 보이지 않습니까? 너 하나있어?
from https://stackoverflow.com/questions/15044603/spring-hibernate-i-cant-delete-a-record-from-a-table by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] http2 요청을하기 위해 Spring의 RestTemplate을 구성하는 방법은 무엇입니까? (0) | 2019.05.12 |
---|---|
[SPRING] 최대 절전 모드 자바 10 (0) | 2019.05.12 |
[SPRING] 봄 mvc : 외부 폴더에 대한 리소스 액세스 (0) | 2019.05.12 |
[SPRING] spring - 클래스 패스 리소스에서 hibernate load * .hbm.xml (0) | 2019.05.12 |
[SPRING] 스프링 MVC @ModelAttribute 메소드가 "잘못된 요청"400을 반환합니다. (0) | 2019.05.12 |