2012-01-23 14 views
10

Để làm việc với cơ sở dữ liệu, lớp của tôi mở rộng lớp HibernateDaoSupport và bên trong các phương thức tôi đang sử dụng Spring HibernateTemplate.Sử dụng Spring HibernateTemplate. Làm thế nào để xóa theo Id?

Vì vậy, ví xóa một hàng trong cơ sở dữ liệu tôi sử dụng phương pháp này:

public void delete(MyObject obj) { 
    getHibernateTemplate().delete(obj); 
} 

tất cả ok!

Nhưng, tại thời điểm này, tôi đang cố gắng để thực hiện một phương pháp mà có thể xóa một hàng dựa trên id:

public void delete(final long id) { 
    // some code here 
} 

Và tôi không thể tìm thấy một số phương pháp HibernateTemplate như thế này:
getHibernateTemplate().remove(id)

Giải pháp tốt cho tôi trong trường hợp này là gì?

Trả lời

28

xóa bằng cách sử id Đặc biệt,

public void delete(long id) 
{ 
    Session session ; 
    MyObject myObject ; 

    session = sessionFactory.getCurrentSession(); 
    myObject = (MyObject)session.load(MyObject.class,id); 
    session.delete(myObject); 

    //This makes the pending delete to be done 
    session.flush() ; 

} 

Cũng xem xét encapuslate phương pháp này trong try/catch/finally và đăng nhập lỗi khi cần thiết

+1

Điều này dường như là giải pháp thanh lịch nhất (không sử dụng truy vấn sql/hql), nhưng nó có vẻ khá kém hiệu quả vì nó xuất hiện để fecth toàn bộ đối tượng để xóa nó. Đó là trường hợp? Tôi nếu vậy, những gì có thể được thực hiện? –

+0

Nếu id không tồn tại, 'myObject' sẽ là null và' delete() 'có thể gây ra lỗi? – NingLee

+0

@NingLee có, bạn nhận được một ngoại lệ do tải xem xét rằng đối tượng tồn tại. Nếu bạn muốn tránh trường hợp ngoại lệ như vậy, hãy sử dụng 'get' thay vì' load' –

7

Như bạn nói, có không phải là phương pháp như vậy trong HibernateTemplate. Bạn có thể làm những điều sau đây,

hibernateTemplate.delete(hibernateTemplate.get(Class,Id)); 
+0

Wow, điều này cũng sẽ giải quyết vấn đề xóa tầng! – Jess

6

Bạn cũng có thể sử dụng dưới phương pháp:

public void deleteById(Class clazz,Integer id) { 
    hibernateTemplate.bulkUpdate("delete from "+clazz.getName()+" where id="+id); 
} 
8

lựa chọn khác là:

public void deleteById(Class clazz,Integer id) { 
    String hql = "delete " + clazz.getName() + " where id = :id"; 
    Query q = session.createQuery(hql).setParameter("id", id); 
    q.executeUpdate(); 
} 
1

Có một giải pháp đơn giản bằng cách tạo ra một đối tượng và chỉ thiết lập ID:

Product product = new Product(); 
product.setId(37); 
session.delete(product); 

Hạn chế của giải pháp đơn giản này là nó không loại bỏ các cá thể liên quan.
Nếu bạn có một số thuộc tính (một thực thể khác có liên quan) của sản phẩm bị xóa, bạn sẽ cần tải sản phẩm trước đó.

Serializable id = new Long(17); 
Object persistentInstance = session.load(Product.class, id); 
if (persistentInstance != null) 
{ 
    session.delete(persistentInstance); 
} 

Điều này sẽ phát hành (nếu bạn có bảng thuộc tính trong thác) xóa trên thuộc tính con.

Các vấn đề liên quan