auditquery hibernate envers with join

时间:2014-12-08 18:40:39

标签: hibernate hibernate-envers

我已将Hibernate envers添加到一个项目中,用于保存和显示试听。 我使用以下语句进行显示审计记录的查询修订。

AuditQuery auditQuery = getAuditReader().createQuery().forRevisionsOfEntity(Entity.class, false, true);

在此查询中,我想加入相关实体,但我在AuditQuery中找不到任何方法来加入。

2 个答案:

答案 0 :(得分:2)

我遇到了类似的情况。我有一个父对象,它有孩子,我需要在给定的时间点重新创建父对象及其所有子对象。

我必须手动完成。在我的情况下,我有一个抽象的DAO对象,我的所有DAO都继承,所以这很容易做到。首先,我向我的基础DAO添加了一个getRev方法,该方法获取父对象的子对象。例如,假设我们有一个Car父对象(将Doors和Tires作为子对象)。

public abstract class AbstractBaseDAO<T extends IModel> implements BaseDAO<T> {
    @Autowired(required=true) protected SessionFactory sessionFactory;

    public AbstractBaseDAO(Class<?> myClass) {
        this.typeParameterClass = (Class<T>)myClass;
    }

    // ... other generic DAO methods, including some CRUD methods

    public List<T> getRev(ICar car, Integer rev) {
        Session session = this.sessionFactory.getCurrentSession();
        AuditReader reader = AuditReaderFactory.get( session );
        AuditQueryCreator queryCreator = reader.createQuery(); 
        AuditQuery query = queryCreator.forEntitiesAtRevision(typeParameterClass, rev);
        query.add(AuditEntity.property("car").eq(car));

        @SuppressWarnings("unchecked")
        List<T> result = query.getResultList();         

        return result;
    }
}

要为如何使用此基础DAO添加一些上下文,我将创建特定于对象的DAO:

public class TireDAO extends AbstractBaseDAO<ITire> {
    public TireDAO() {
        super(Tire.class);
    }
}
public class DoorDAO extends AbstractBaseDAO<IDoor> {
    public DoorDAO() {
        super(Door.class);
    }
}

我为父级的DAO覆盖了这个,因为在这种情况下我们想要获取父对象本身,而不是为该父级获取子对象:

public class CarDAO extends AbstractBaseDAO<ICar> {
    public CarDAO() {
        super(Car.class);
    }

    @Override
    public ICar getRev(Integer id, Integer rev) {
        Session session = this.sessionFactory.getCurrentSession();
        AuditReader reader = AuditReaderFactory.get( session );
        AuditQueryCreator queryCreator = reader.createQuery(); 
        AuditQuery query = queryCreator.forEntitiesAtRevision(typeParameterClass, rev);
        query.add(AuditEntity.id().eq(id));

        return (SecurityUser)query.getSingleResult();
    }
}

现在,在我用来获取特定版本的Car的服务对象中,我添加了一个这样的方法:

@Autowired(required=true) CarDAO carDao;
@Autowired(required=true) TireDAO tireDao;
@Autowired(required=true) DoorDAO doorDao;

@Transactional
public ICar getFullRevision(Integer id, Integer rev) throws Exception {
    ICar car = this.carDao.getRev(id, rev);

    Set<ITire> tires = new HashSet<ITire>(tireDAO.getRev(car, rev));
    car.setTires(tires);

    Set<IDoor> doors = new HashSet<IDoor>(doorDAO.getRev(car, rev));
    car.setDoors(doors);

    return car;
}

答案 1 :(得分:1)

正如文档所说,审核查询目前不支持联接。