2012-09-20 129 views
1

我有一個項目,最近從OpenJPA轉換爲Hibernate。在替換特定於OpenJPA的配置部分時,我遇到了一個我無法在Hibernate中複製的函數。休眠定製刪除策略

OpenJPA中,我們通過使用@Strategy註釋實體並提供org.apache.openjpa.jdbc.meta.strats.AbstractStrategy的實例來執行自定義刪除操作。在customDelete方法中,我們調用單個共享存儲過程並傳遞表名,實體標識和用戶標識來執行操作,此過程將刪除實體並創建審覈日誌條目。

Hibernate,我可以找到一些可用的鉤子,但沒有一個似乎提供相同的功能。我已經看過了以下內容:

  1. @SQLDelete(「客戶刪除查詢」) - 此選項僅允許您訪問ID,而不是表名或用戶ID,以便每個類的定製和仍然缺乏信息

  2. EntityListener類 - 這個選項告訴你刪除的實體,而是需要挖掘得到的實際上涉及到哪些表,是一個單一的數據庫操作

的範圍是否有是任何其他選項與OpenJPA方法更接近匹配,或者是我最好的選擇,與EntityLister類,並做我自己的繁重確定表名稱?

回答

0

怎麼樣DAO對象爲您的持久性您可以在其中定義自定義數據庫方法的類。這是一個使用HiberObjects生成的示例DAO。可以通過刪除@generated註釋來根據需要定義生成的方法。

package de.cw.minifigfinder.dao; 

import javax.persistence.EntityTransaction; 

import de.cw.minifigfinder.model.UIValues; 

/** 
* @generated 
*/ 
public class UIValuesDAO { 

private static final String ID = "MINIFIGFINDER"; 

/** 
* @generated 
*/ 
public UIValuesDAO() { 
} 

/** 
* @generated 
*/ 
private javax.persistence.EntityManager getSession() { 
    return de.cw.minifigfinder.util.HibernateHelper.getInstance() 
      .getEntityManager(); 
} 

public Long create() { 
    UIValues object = new UIValues(); 
    object.setValuesID(ID); 
    if (object == null) 
     throw new IllegalArgumentException("object"); 
    javax.persistence.EntityManager em = getSession(); 
    EntityTransaction tx = null; 
    try { 
     tx = em.getTransaction(); 
     tx.begin(); 
     em.persist(object); 
     tx.commit(); 
    } catch (RuntimeException e) { 
     if (tx != null) 
      tx.rollback(); 
     throw e; // or display error message 
    } finally { 
     em.close(); 
    } 
    return object.getId(); 
} 


/** 
* @generated 
*/ 
public void delete(de.cw.minifigfinder.model.UIValues object) { 
    if (object == null) 
     throw new IllegalArgumentException("object"); 
    getSession().remove(object); 
} 

}