Hibernate自定义删除策略

时间:2012-09-20 17:14:37

标签: java hibernate openjpa

我有一个最近从OpenJPA转换为Hibernate的项目。在替换特定于OpenJPA的配置部分时,我遇到了一个我无法在Hibernate中复制的函数。

OpenJPA中,我们通过使用@Strategy注释实体并提供org.apache.openjpa.jdbc.meta.strats.AbstractStrategy的实例来执行自定义删除。在customDelete方法中,我们调用单个共享存储过程并传递表名,实体ID和执行操作的用户标识,此过程将删除实体并创建审核日志条目。

Hibernate中,我可以找到许多可用的钩子,但似乎都没有提供相同的功能。我看过以下内容:

  1. @SQLDelete(“客户删除查询”) - 此选项仅允许您访问id,而不是表名或用户ID,因此每个类自定义且仍然缺少信息

  2. EntityListener类 - 此选项告诉您实体已删除,但需要挖掘以了解实际涉及哪些表并且超出单个数据库操作的范围

  3. 是否有任何其他选项与OpenJPA方法更接近,或者我最好选择EntityLister类,并自行负担确定表名?

1 个答案:

答案 0 :(得分:0)

您的持久性类的DAO-Object怎么样,您可以在其中定义自定义数据库方法。这是一个用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);
}

}