【问题标题】:Hibernate custom delete strategyHibernate 自定义删除策略
【发布时间】:2012-09-20 17:14:37
【问题描述】:

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

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

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

  1. @SQLDelete("customer delete query") - 此选项仅允许您访问 id,而不是表名或用户 id,因此每个类都可以自定义并且仍然缺少信息

  2. EntityListener 类 - 此选项告诉您删除的实体,但需要深入了解实际涉及哪些表,并且超出单个 db 操作的范围

是否有任何其他选项更接近 OpenJPA 方法,或者我最好的选择是使用 EntityLister 类并自己做繁重的工作来确定表名?

【问题讨论】:

    标签: java hibernate openjpa


    【解决方案1】:

    为您的持久性类创建一个 DAO 对象怎么样,您可以在其中定义自定义 DB 方法。这是一个使用 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);
    }
    

    }

    【讨论】:

      猜你喜欢
      • 2013-02-05
      • 1970-01-01
      • 1970-01-01
      • 2021-02-12
      • 2014-07-03
      • 2011-03-31
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多