2013-02-23 1 views
3

저는 Spring 필드에서 매우 새롭습니다. 이번에는 DAO 개체를 만들기 위해 Hibernate와 통합하는 방법을 연구 중이지만 과 함께 몇 가지 어려움을 발견하고 있습니다.봄 + 최대 절전 모드 : 테이블에서 레코드를 삭제할 수 없습니다.

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 작업 을 테스트 할 수있는 기본 클래스를 만들 수 있습니다

그래서 나는 사람이 테이블을 가지고 있고 나는 내 DAO 객체 구현이 구체적인 클래스를 만들도록
작업을 ... 삭제 나는 새 객체를 dable에 삽입하거나, 단일 객체 또는 모든 객체의 목록을 가져 오는 데 아무런 문제가 없습니다. 테이블에서 개체를 삭제하려면 문제가 발생했습니다. '

dao.delete(listaPersone.get(i).getPid()); 

그러나 돈 : 나는 간단하게 할주기를 실행하는 모든 테이블 레코드를 삭제하는 것을 시도하고이 클래스의 끝에서

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

} 
} 

:

내 테스트 클래스 그리고 내 테이블에서 모든 기록은 여전히 ​​동일하게 유지됩니다 ...

왜? 내 코드에서 무엇이 잘못 되었습니까? 그가 작동 저장하지만 삭제 보인다 코드에서

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

이 코드를 포함 할 수 그것은 예입니다 @Transaction 이 포함되어 있는가 Person 객체에 대해서도 마찬가지입니다. –

+0

오클라호마 주역에서 필자는 Person 클래스 코드를 추가했습니다 – AndreaNobili

+0

프로그램 출력도 포함시킬 수 있습니까? –

답변

0

되지 않습니다 : 이것은 내 Person 클래스 코드

(나는 ...을 제외하지 않은 경우). 세션이 트랜잭션과 동기화되었다고 가정합니다 (트랜잭션이 완료되기 전에 세션 플러시). 을 delete 방법에 적용하면 효과가 있습니다.

+0

아직 작동하지 않음으로 추가됨 ... 원래 주제의 Person 클래스를 포함했습니다. – AndreaNobili

0

삭제 방법에 @Transactional이 표시되지 않습니까? 너 하나있어 어떻게

+0

이 여전히 작동하지 않음 ... Person 클래스를 원래 항목에 포함했습니다. – AndreaNobili

+0

github에 코드를 넣지 마십시오. 'beginTransaction()'을 쓰면 – JohnNY

1

삭제 방법 어떻게 생겼어?

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

당신이

+1

을 볼 것입니다. 트랜잭션을'commit() '할 필요가 없습니까? – KNU

+0

아니요, @Transactional을 가지고 있기 때문에 모든 거래가 이제이 주석에서 처리됩니다;) – wolver

+0

aah, 전에는 사용한 적이 없었습니다. 이번 주말 테스트 할 가치가 있습니다. – KNU

2

내가 그런 식으로이 문제를 해결 한 반환 한 Statment 전에 세션을 닫는 것이 확인 :

@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(); 
    } 
} 
관련 문제