我已将Hibernate envers
添加到一个项目中,用于保存和显示试听。
我使用以下语句进行显示审计记录的查询修订。
AuditQuery auditQuery = getAuditReader().createQuery().forRevisionsOfEntity(Entity.class, false, true);
在此查询中,我想加入相关实体,但我在AuditQuery
中找不到任何方法来加入。
答案 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)
正如文档所说,审核查询目前不支持联接。