HHH-6738 - Fix and test
This commit is contained in:
parent
d1ac167ec6
commit
69db917760
|
@ -22,8 +22,9 @@
|
|||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.envers.entities.mapper.relation.query;
|
||||
import java.util.Collections;
|
||||
|
||||
import static org.hibernate.envers.entities.mapper.relation.query.QueryConstants.*;
|
||||
import java.util.Collections;
|
||||
import org.hibernate.Query;
|
||||
import org.hibernate.envers.RevisionType;
|
||||
import org.hibernate.envers.configuration.AuditEntitiesConfiguration;
|
||||
|
@ -73,8 +74,8 @@ public final class OneAuditEntityQueryGenerator implements RelationQueryGenerato
|
|||
String versionsReferencedEntityName = verEntCfg.getAuditEntityName(referencedEntityName);
|
||||
|
||||
// SELECT e FROM versionsEntity e
|
||||
QueryBuilder qb = new QueryBuilder(versionsReferencedEntityName, "e");
|
||||
qb.addProjection(null, "e", false, false);
|
||||
QueryBuilder qb = new QueryBuilder(versionsReferencedEntityName, REFERENCED_ENTITY_ALIAS);
|
||||
qb.addProjection(null, REFERENCED_ENTITY_ALIAS, false, false);
|
||||
// WHERE
|
||||
Parameters rootParameters = qb.getRootParameters();
|
||||
// e.id_ref_ed = :id_ref_ed
|
||||
|
@ -84,10 +85,10 @@ public final class OneAuditEntityQueryGenerator implements RelationQueryGenerato
|
|||
// --> based on auditStrategy (see above)
|
||||
auditStrategy.addEntityAtRevisionRestriction(globalCfg, qb, revisionPropertyPath,
|
||||
verEntCfg.getRevisionEndFieldName(), true, referencedIdData,
|
||||
revisionPropertyPath, originalIdPropertyName, "e", "e2");
|
||||
revisionPropertyPath, originalIdPropertyName, REFERENCED_ENTITY_ALIAS, REFERENCED_ENTITY_ALIAS_DEF_AUD_STR);
|
||||
|
||||
// e.revision_type != DEL
|
||||
rootParameters.addWhereWithNamedParam(verEntCfg.getRevisionTypePropName(), false, "!=", "delrevisiontype");
|
||||
rootParameters.addWhereWithNamedParam(verEntCfg.getRevisionTypePropName(), false, "!=", DEL_REVISION_TYPE_PARAMETER);
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
qb.build(sb, Collections.<String, Object>emptyMap());
|
||||
|
@ -96,8 +97,8 @@ public final class OneAuditEntityQueryGenerator implements RelationQueryGenerato
|
|||
|
||||
public Query getQuery(AuditReaderImplementor versionsReader, Object primaryKey, Number revision) {
|
||||
Query query = versionsReader.getSession().createQuery(queryString);
|
||||
query.setParameter("revision", revision);
|
||||
query.setParameter("delrevisiontype", RevisionType.DEL);
|
||||
query.setParameter(REVISION_PARAMETER, revision);
|
||||
query.setParameter(DEL_REVISION_TYPE_PARAMETER, RevisionType.DEL);
|
||||
for (QueryParameterData paramData: referencingIdData.getPrefixedMapper().mapToQueryParametersFromId(primaryKey)) {
|
||||
paramData.setParameterValue(query);
|
||||
}
|
||||
|
|
|
@ -22,8 +22,9 @@
|
|||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.envers.entities.mapper.relation.query;
|
||||
import java.util.Collections;
|
||||
|
||||
import static org.hibernate.envers.entities.mapper.relation.query.QueryConstants.*;
|
||||
import java.util.Collections;
|
||||
import org.hibernate.Query;
|
||||
import org.hibernate.envers.RevisionType;
|
||||
import org.hibernate.envers.configuration.AuditEntitiesConfiguration;
|
||||
|
@ -73,14 +74,14 @@ public final class OneEntityQueryGenerator implements RelationQueryGenerator {
|
|||
String originalIdPropertyName = verEntCfg.getOriginalIdPropName();
|
||||
|
||||
// SELECT ee FROM middleEntity ee
|
||||
QueryBuilder qb = new QueryBuilder(versionsMiddleEntityName, "ee");
|
||||
qb.addProjection(null, "ee", false, false);
|
||||
QueryBuilder qb = new QueryBuilder(versionsMiddleEntityName, MIDDLE_ENTITY_ALIAS);
|
||||
qb.addProjection(null, MIDDLE_ENTITY_ALIAS, false, false);
|
||||
// WHERE
|
||||
Parameters rootParameters = qb.getRootParameters();
|
||||
// ee.originalId.id_ref_ing = :id_ref_ing
|
||||
referencingIdData.getPrefixedMapper().addNamedIdEqualsToQuery(rootParameters, originalIdPropertyName, true);
|
||||
|
||||
String eeOriginalIdPropertyPath = "ee." + originalIdPropertyName;
|
||||
String eeOriginalIdPropertyPath = MIDDLE_ENTITY_ALIAS + "." + originalIdPropertyName;
|
||||
|
||||
// (with ee association at revision :revision)
|
||||
// --> based on auditStrategy (see above)
|
||||
|
@ -89,7 +90,7 @@ public final class OneEntityQueryGenerator implements RelationQueryGenerator {
|
|||
eeOriginalIdPropertyPath, revisionPropertyPath, originalIdPropertyName, componentDatas);
|
||||
|
||||
// ee.revision_type != DEL
|
||||
rootParameters.addWhereWithNamedParam(verEntCfg.getRevisionTypePropName(), "!=", "delrevisiontype");
|
||||
rootParameters.addWhereWithNamedParam(verEntCfg.getRevisionTypePropName(), "!=", DEL_REVISION_TYPE_PARAMETER);
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
qb.build(sb, Collections.<String, Object>emptyMap());
|
||||
|
@ -98,8 +99,8 @@ public final class OneEntityQueryGenerator implements RelationQueryGenerator {
|
|||
|
||||
public Query getQuery(AuditReaderImplementor versionsReader, Object primaryKey, Number revision) {
|
||||
Query query = versionsReader.getSession().createQuery(queryString);
|
||||
query.setParameter("revision", revision);
|
||||
query.setParameter("delrevisiontype", RevisionType.DEL);
|
||||
query.setParameter(REVISION_PARAMETER, revision);
|
||||
query.setParameter(DEL_REVISION_TYPE_PARAMETER, RevisionType.DEL);
|
||||
for (QueryParameterData paramData: referencingIdData.getPrefixedMapper().mapToQueryParametersFromId(primaryKey)) {
|
||||
paramData.setParameterValue(query);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
package org.hibernate.envers.entities.mapper.relation.query;
|
||||
|
||||
/**
|
||||
* Constants used in JPQL queries.
|
||||
*
|
||||
* @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com)
|
||||
*/
|
||||
public class QueryConstants {
|
||||
public static final String REFERENCED_ENTITY_ALIAS = "e_h";
|
||||
public static final String REFERENCED_ENTITY_ALIAS_DEF_AUD_STR = "e2_h";
|
||||
|
||||
public static final String INDEX_ENTITY_ALIAS = "f_h";
|
||||
public static final String INDEX_ENTITY_ALIAS_DEF_AUD_STR = "f2_h";
|
||||
|
||||
public static final String MIDDLE_ENTITY_ALIAS = "ee_h";
|
||||
public static final String MIDDLE_ENTITY_ALIAS_DEF_AUD_STR = "ee2_h";
|
||||
|
||||
public static final String REVISION_PARAMETER = "revision";
|
||||
public static final String DEL_REVISION_TYPE_PARAMETER = "delrevisiontype";
|
||||
}
|
|
@ -22,8 +22,9 @@
|
|||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.envers.entities.mapper.relation.query;
|
||||
import java.util.Collections;
|
||||
|
||||
import static org.hibernate.envers.entities.mapper.relation.query.QueryConstants.*;
|
||||
import java.util.Collections;
|
||||
import org.hibernate.Query;
|
||||
import org.hibernate.envers.RevisionType;
|
||||
import org.hibernate.envers.configuration.AuditEntitiesConfiguration;
|
||||
|
@ -114,35 +115,35 @@ public final class ThreeEntityQueryGenerator implements RelationQueryGenerator {
|
|||
*/
|
||||
String revisionPropertyPath = verEntCfg.getRevisionNumberPath();
|
||||
String originalIdPropertyName = verEntCfg.getOriginalIdPropName();
|
||||
String eeOriginalIdPropertyPath = "ee." + originalIdPropertyName;
|
||||
String eeOriginalIdPropertyPath = MIDDLE_ENTITY_ALIAS + "." + originalIdPropertyName;
|
||||
|
||||
// SELECT new list(ee) FROM middleEntity ee
|
||||
QueryBuilder qb = new QueryBuilder(versionsMiddleEntityName, "ee");
|
||||
qb.addFrom(referencedIdData.getAuditEntityName(), "e");
|
||||
qb.addFrom(indexIdData.getAuditEntityName(), "f");
|
||||
qb.addProjection("new list", "ee, e, f", false, false);
|
||||
QueryBuilder qb = new QueryBuilder(versionsMiddleEntityName, MIDDLE_ENTITY_ALIAS);
|
||||
qb.addFrom(referencedIdData.getAuditEntityName(), REFERENCED_ENTITY_ALIAS);
|
||||
qb.addFrom(indexIdData.getAuditEntityName(), INDEX_ENTITY_ALIAS);
|
||||
qb.addProjection("new list", MIDDLE_ENTITY_ALIAS + ", " + REFERENCED_ENTITY_ALIAS + ", " + INDEX_ENTITY_ALIAS, false, false);
|
||||
// WHERE
|
||||
Parameters rootParameters = qb.getRootParameters();
|
||||
// ee.id_ref_ed = e.id_ref_ed
|
||||
referencedIdData.getPrefixedMapper().addIdsEqualToQuery(rootParameters, eeOriginalIdPropertyPath,
|
||||
referencedIdData.getOriginalMapper(), "e." + originalIdPropertyName);
|
||||
referencedIdData.getOriginalMapper(), REFERENCED_ENTITY_ALIAS + "." + originalIdPropertyName);
|
||||
// ee.id_ref_ind = f.id_ref_ind
|
||||
indexIdData.getPrefixedMapper().addIdsEqualToQuery(rootParameters, eeOriginalIdPropertyPath,
|
||||
indexIdData.getOriginalMapper(), "f." + originalIdPropertyName);
|
||||
indexIdData.getOriginalMapper(), INDEX_ENTITY_ALIAS + "." + originalIdPropertyName);
|
||||
// ee.originalId.id_ref_ing = :id_ref_ing
|
||||
referencingIdData.getPrefixedMapper().addNamedIdEqualsToQuery(rootParameters, originalIdPropertyName, true);
|
||||
|
||||
// (selecting e entities at revision :revision)
|
||||
// --> based on auditStrategy (see above)
|
||||
auditStrategy.addEntityAtRevisionRestriction(globalCfg, qb, "e." + revisionPropertyPath,
|
||||
"e." + verEntCfg.getRevisionEndFieldName(), false,
|
||||
referencedIdData, revisionPropertyPath, originalIdPropertyName, "e", "e2");
|
||||
auditStrategy.addEntityAtRevisionRestriction(globalCfg, qb, REFERENCED_ENTITY_ALIAS + "." + revisionPropertyPath,
|
||||
REFERENCED_ENTITY_ALIAS + "." + verEntCfg.getRevisionEndFieldName(), false,
|
||||
referencedIdData, revisionPropertyPath, originalIdPropertyName, REFERENCED_ENTITY_ALIAS, REFERENCED_ENTITY_ALIAS_DEF_AUD_STR);
|
||||
|
||||
// (selecting f entities at revision :revision)
|
||||
// --> based on auditStrategy (see above)
|
||||
auditStrategy.addEntityAtRevisionRestriction(globalCfg, qb, "e." + revisionPropertyPath,
|
||||
"e." + verEntCfg.getRevisionEndFieldName(), false,
|
||||
referencedIdData, revisionPropertyPath, originalIdPropertyName, "f", "f2");
|
||||
auditStrategy.addEntityAtRevisionRestriction(globalCfg, qb, REFERENCED_ENTITY_ALIAS + "." + revisionPropertyPath,
|
||||
REFERENCED_ENTITY_ALIAS + "." + verEntCfg.getRevisionEndFieldName(), false,
|
||||
referencedIdData, revisionPropertyPath, originalIdPropertyName, INDEX_ENTITY_ALIAS, INDEX_ENTITY_ALIAS_DEF_AUD_STR);
|
||||
|
||||
// (with ee association at revision :revision)
|
||||
// --> based on auditStrategy (see above)
|
||||
|
@ -151,11 +152,11 @@ public final class ThreeEntityQueryGenerator implements RelationQueryGenerator {
|
|||
eeOriginalIdPropertyPath, revisionPropertyPath, originalIdPropertyName, componentDatas);
|
||||
|
||||
// ee.revision_type != DEL
|
||||
rootParameters.addWhereWithNamedParam(verEntCfg.getRevisionTypePropName(), "!=", "delrevisiontype");
|
||||
rootParameters.addWhereWithNamedParam(verEntCfg.getRevisionTypePropName(), "!=", DEL_REVISION_TYPE_PARAMETER);
|
||||
// e.revision_type != DEL
|
||||
rootParameters.addWhereWithNamedParam("e." + verEntCfg.getRevisionTypePropName(), false, "!=", "delrevisiontype");
|
||||
rootParameters.addWhereWithNamedParam(REFERENCED_ENTITY_ALIAS + "." + verEntCfg.getRevisionTypePropName(), false, "!=", DEL_REVISION_TYPE_PARAMETER);
|
||||
// f.revision_type != DEL
|
||||
rootParameters.addWhereWithNamedParam("f." + verEntCfg.getRevisionTypePropName(), false, "!=", "delrevisiontype");
|
||||
rootParameters.addWhereWithNamedParam(INDEX_ENTITY_ALIAS + "." + verEntCfg.getRevisionTypePropName(), false, "!=", DEL_REVISION_TYPE_PARAMETER);
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
qb.build(sb, Collections.<String, Object>emptyMap());
|
||||
|
@ -164,8 +165,8 @@ public final class ThreeEntityQueryGenerator implements RelationQueryGenerator {
|
|||
|
||||
public Query getQuery(AuditReaderImplementor versionsReader, Object primaryKey, Number revision) {
|
||||
Query query = versionsReader.getSession().createQuery(queryString);
|
||||
query.setParameter("revision", revision);
|
||||
query.setParameter("delrevisiontype", RevisionType.DEL);
|
||||
query.setParameter(REVISION_PARAMETER, revision);
|
||||
query.setParameter(DEL_REVISION_TYPE_PARAMETER, RevisionType.DEL);
|
||||
for (QueryParameterData paramData: referencingIdData.getPrefixedMapper().mapToQueryParametersFromId(primaryKey)) {
|
||||
paramData.setParameterValue(query);
|
||||
}
|
||||
|
|
|
@ -22,8 +22,9 @@
|
|||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.envers.entities.mapper.relation.query;
|
||||
import java.util.Collections;
|
||||
|
||||
import static org.hibernate.envers.entities.mapper.relation.query.QueryConstants.*;
|
||||
import java.util.Collections;
|
||||
import org.hibernate.Query;
|
||||
import org.hibernate.envers.RevisionType;
|
||||
import org.hibernate.envers.configuration.AuditEntitiesConfiguration;
|
||||
|
@ -75,17 +76,17 @@ public final class TwoEntityOneAuditedQueryGenerator implements RelationQueryGen
|
|||
String revisionPropertyPath = verEntCfg.getRevisionNumberPath();
|
||||
String originalIdPropertyName = verEntCfg.getOriginalIdPropName();
|
||||
|
||||
String eeOriginalIdPropertyPath = "ee." + originalIdPropertyName;
|
||||
String eeOriginalIdPropertyPath = MIDDLE_ENTITY_ALIAS + "." + originalIdPropertyName;
|
||||
|
||||
// SELECT new list(ee) FROM middleEntity ee
|
||||
QueryBuilder qb = new QueryBuilder(versionsMiddleEntityName, "ee");
|
||||
qb.addFrom(referencedIdData.getEntityName(), "e");
|
||||
qb.addProjection("new list", "ee, e", false, false);
|
||||
QueryBuilder qb = new QueryBuilder(versionsMiddleEntityName, MIDDLE_ENTITY_ALIAS);
|
||||
qb.addFrom(referencedIdData.getEntityName(), REFERENCED_ENTITY_ALIAS);
|
||||
qb.addProjection("new list", MIDDLE_ENTITY_ALIAS + ", " + REFERENCED_ENTITY_ALIAS, false, false);
|
||||
// WHERE
|
||||
Parameters rootParameters = qb.getRootParameters();
|
||||
// ee.id_ref_ed = e.id_ref_ed
|
||||
referencedIdData.getPrefixedMapper().addIdsEqualToQuery(rootParameters, eeOriginalIdPropertyPath,
|
||||
referencedIdData.getOriginalMapper(), "e");
|
||||
referencedIdData.getOriginalMapper(), REFERENCED_ENTITY_ALIAS);
|
||||
// ee.originalId.id_ref_ing = :id_ref_ing
|
||||
referencingIdData.getPrefixedMapper().addNamedIdEqualsToQuery(rootParameters, originalIdPropertyName, true);
|
||||
|
||||
|
@ -96,7 +97,7 @@ public final class TwoEntityOneAuditedQueryGenerator implements RelationQueryGen
|
|||
eeOriginalIdPropertyPath, revisionPropertyPath, originalIdPropertyName, componentDatas);
|
||||
|
||||
// ee.revision_type != DEL
|
||||
rootParameters.addWhereWithNamedParam(verEntCfg.getRevisionTypePropName(), "!=", "delrevisiontype");
|
||||
rootParameters.addWhereWithNamedParam(verEntCfg.getRevisionTypePropName(), "!=", DEL_REVISION_TYPE_PARAMETER);
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
qb.build(sb, Collections.<String, Object>emptyMap());
|
||||
|
@ -105,8 +106,8 @@ public final class TwoEntityOneAuditedQueryGenerator implements RelationQueryGen
|
|||
|
||||
public Query getQuery(AuditReaderImplementor versionsReader, Object primaryKey, Number revision) {
|
||||
Query query = versionsReader.getSession().createQuery(queryString);
|
||||
query.setParameter("revision", revision);
|
||||
query.setParameter("delrevisiontype", RevisionType.DEL);
|
||||
query.setParameter(REVISION_PARAMETER, revision);
|
||||
query.setParameter(DEL_REVISION_TYPE_PARAMETER, RevisionType.DEL);
|
||||
for (QueryParameterData paramData: referencingIdData.getPrefixedMapper().mapToQueryParametersFromId(primaryKey)) {
|
||||
paramData.setParameterValue(query);
|
||||
}
|
||||
|
|
|
@ -22,8 +22,9 @@
|
|||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.envers.entities.mapper.relation.query;
|
||||
import java.util.Collections;
|
||||
|
||||
import static org.hibernate.envers.entities.mapper.relation.query.QueryConstants.*;
|
||||
import java.util.Collections;
|
||||
import org.hibernate.Query;
|
||||
import org.hibernate.envers.RevisionType;
|
||||
import org.hibernate.envers.configuration.AuditEntitiesConfiguration;
|
||||
|
@ -87,25 +88,25 @@ public final class TwoEntityQueryGenerator implements RelationQueryGenerator {
|
|||
String revisionPropertyPath = verEntCfg.getRevisionNumberPath();
|
||||
String originalIdPropertyName = verEntCfg.getOriginalIdPropName();
|
||||
|
||||
String eeOriginalIdPropertyPath = "ee." + originalIdPropertyName;
|
||||
String eeOriginalIdPropertyPath = MIDDLE_ENTITY_ALIAS + "." + originalIdPropertyName;
|
||||
|
||||
// SELECT new list(ee) FROM middleEntity ee
|
||||
QueryBuilder qb = new QueryBuilder(versionsMiddleEntityName, "ee");
|
||||
qb.addFrom(referencedIdData.getAuditEntityName(), "e");
|
||||
qb.addProjection("new list", "ee, e", false, false);
|
||||
QueryBuilder qb = new QueryBuilder(versionsMiddleEntityName, MIDDLE_ENTITY_ALIAS);
|
||||
qb.addFrom(referencedIdData.getAuditEntityName(), REFERENCED_ENTITY_ALIAS);
|
||||
qb.addProjection("new list", MIDDLE_ENTITY_ALIAS + ", " + REFERENCED_ENTITY_ALIAS, false, false);
|
||||
// WHERE
|
||||
Parameters rootParameters = qb.getRootParameters();
|
||||
// ee.id_ref_ed = e.id_ref_ed
|
||||
referencedIdData.getPrefixedMapper().addIdsEqualToQuery(rootParameters, eeOriginalIdPropertyPath,
|
||||
referencedIdData.getOriginalMapper(), "e." + originalIdPropertyName);
|
||||
referencedIdData.getOriginalMapper(), REFERENCED_ENTITY_ALIAS + "." + originalIdPropertyName);
|
||||
// ee.originalId.id_ref_ing = :id_ref_ing
|
||||
referencingIdData.getPrefixedMapper().addNamedIdEqualsToQuery(rootParameters, originalIdPropertyName, true);
|
||||
|
||||
// (selecting e entities at revision :revision)
|
||||
// --> based on auditStrategy (see above)
|
||||
auditStrategy.addEntityAtRevisionRestriction(globalCfg, qb, "e." + revisionPropertyPath,
|
||||
"e." + verEntCfg.getRevisionEndFieldName(), false,
|
||||
referencedIdData, revisionPropertyPath, originalIdPropertyName, "e", "e2");
|
||||
auditStrategy.addEntityAtRevisionRestriction(globalCfg, qb, REFERENCED_ENTITY_ALIAS + "." + revisionPropertyPath,
|
||||
REFERENCED_ENTITY_ALIAS + "." + verEntCfg.getRevisionEndFieldName(), false,
|
||||
referencedIdData, revisionPropertyPath, originalIdPropertyName, REFERENCED_ENTITY_ALIAS, REFERENCED_ENTITY_ALIAS_DEF_AUD_STR);
|
||||
|
||||
// (with ee association at revision :revision)
|
||||
// --> based on auditStrategy (see above)
|
||||
|
@ -114,9 +115,9 @@ public final class TwoEntityQueryGenerator implements RelationQueryGenerator {
|
|||
eeOriginalIdPropertyPath, revisionPropertyPath, originalIdPropertyName, componentDatas);
|
||||
|
||||
// ee.revision_type != DEL
|
||||
rootParameters.addWhereWithNamedParam(verEntCfg.getRevisionTypePropName(), "!=", "delrevisiontype");
|
||||
rootParameters.addWhereWithNamedParam(verEntCfg.getRevisionTypePropName(), "!=", DEL_REVISION_TYPE_PARAMETER);
|
||||
// e.revision_type != DEL
|
||||
rootParameters.addWhereWithNamedParam("e." + verEntCfg.getRevisionTypePropName(), false, "!=", "delrevisiontype");
|
||||
rootParameters.addWhereWithNamedParam(REFERENCED_ENTITY_ALIAS + "." + verEntCfg.getRevisionTypePropName(), false, "!=", DEL_REVISION_TYPE_PARAMETER);
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
qb.build(sb, Collections.<String, Object>emptyMap());
|
||||
|
@ -125,8 +126,8 @@ public final class TwoEntityQueryGenerator implements RelationQueryGenerator {
|
|||
|
||||
public Query getQuery(AuditReaderImplementor versionsReader, Object primaryKey, Number revision) {
|
||||
Query query = versionsReader.getSession().createQuery(queryString);
|
||||
query.setParameter("revision", revision);
|
||||
query.setParameter("delrevisiontype", RevisionType.DEL);
|
||||
query.setParameter(REVISION_PARAMETER, revision);
|
||||
query.setParameter(DEL_REVISION_TYPE_PARAMETER, RevisionType.DEL);
|
||||
for (QueryParameterData paramData: referencingIdData.getPrefixedMapper().mapToQueryParametersFromId(primaryKey)) {
|
||||
paramData.setParameterValue(query);
|
||||
}
|
||||
|
|
|
@ -22,11 +22,12 @@
|
|||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.envers.query.impl;
|
||||
|
||||
import static org.hibernate.envers.entities.mapper.relation.query.QueryConstants.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import javax.persistence.NoResultException;
|
||||
import javax.persistence.NonUniqueResultException;
|
||||
|
||||
import org.hibernate.CacheMode;
|
||||
import org.hibernate.FlushMode;
|
||||
import org.hibernate.LockMode;
|
||||
|
@ -81,7 +82,7 @@ public abstract class AbstractAuditQuery implements AuditQuery {
|
|||
versionsEntityName = verCfg.getAuditEntCfg().getAuditEntityName(
|
||||
entityName);
|
||||
|
||||
qb = new QueryBuilder(versionsEntityName, "e");
|
||||
qb = new QueryBuilder(versionsEntityName, REFERENCED_ENTITY_ALIAS);
|
||||
}
|
||||
|
||||
protected Query buildQuery() {
|
||||
|
@ -220,7 +221,7 @@ public abstract class AbstractAuditQuery implements AuditQuery {
|
|||
if (cacheMode != null) query.setCacheMode(cacheMode);
|
||||
if (timeout != null) query.setTimeout(timeout);
|
||||
if (lockOptions != null && lockOptions.getLockMode() != LockMode.NONE) {
|
||||
query.setLockMode("e", lockOptions.getLockMode());
|
||||
query.setLockMode(REFERENCED_ENTITY_ALIAS, lockOptions.getLockMode());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,10 +22,11 @@
|
|||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.envers.query.impl;
|
||||
|
||||
import static org.hibernate.envers.entities.mapper.relation.query.QueryConstants.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.Query;
|
||||
import org.hibernate.envers.RevisionType;
|
||||
import org.hibernate.envers.configuration.AuditConfiguration;
|
||||
|
@ -84,7 +85,7 @@ public class EntitiesAtRevisionQuery extends AbstractAuditQuery {
|
|||
// --> based on auditStrategy (see above)
|
||||
verCfg.getAuditStrategy().addEntityAtRevisionRestriction(verCfg.getGlobalCfg(), qb, revisionPropertyPath,
|
||||
verEntCfg.getRevisionEndFieldName(), true, referencedIdData,
|
||||
revisionPropertyPath, originalIdPropertyName, "e", "e2");
|
||||
revisionPropertyPath, originalIdPropertyName, REFERENCED_ENTITY_ALIAS, REFERENCED_ENTITY_ALIAS_DEF_AUD_STR);
|
||||
|
||||
// e.revision_type != DEL
|
||||
qb.getRootParameters().addWhereWithParam(verEntCfg.getRevisionTypePropName(), "<>", RevisionType.DEL);
|
||||
|
@ -97,8 +98,8 @@ public class EntitiesAtRevisionQuery extends AbstractAuditQuery {
|
|||
Query query = buildQuery();
|
||||
// add named parameter (only used for ValidAuditTimeStrategy)
|
||||
List<String> params = Arrays.asList(query.getNamedParameters());
|
||||
if (params.contains("revision")) {
|
||||
query.setParameter("revision", revision);
|
||||
if (params.contains(REVISION_PARAMETER)) {
|
||||
query.setParameter(REVISION_PARAMETER, revision);
|
||||
}
|
||||
List queryResult = query.list();
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package org.hibernate.envers.strategy;
|
||||
import java.io.Serializable;
|
||||
|
||||
import static org.hibernate.envers.entities.mapper.relation.query.QueryConstants.*;
|
||||
import java.io.Serializable;
|
||||
import org.hibernate.Session;
|
||||
import org.hibernate.envers.configuration.AuditConfiguration;
|
||||
import org.hibernate.envers.configuration.GlobalConfiguration;
|
||||
|
@ -49,7 +50,7 @@ public class DefaultAuditStrategy implements AuditStrategy {
|
|||
// WHERE
|
||||
Parameters maxERevQbParameters = maxERevQb.getRootParameters();
|
||||
// e2.revision <= :revision
|
||||
maxERevQbParameters.addWhereWithNamedParam(revisionPropertyPath, "<=", "revision");
|
||||
maxERevQbParameters.addWhereWithNamedParam(revisionPropertyPath, "<=", REVISION_PARAMETER);
|
||||
// e2.id_ref_ed = e.id_ref_ed
|
||||
idData.getOriginalMapper().addIdsEqualToQuery(maxERevQbParameters,
|
||||
alias1 + "." + originalIdPropertyName, alias2 +"." + originalIdPropertyName);
|
||||
|
@ -66,14 +67,14 @@ public class DefaultAuditStrategy implements AuditStrategy {
|
|||
Parameters rootParameters = rootQueryBuilder.getRootParameters();
|
||||
|
||||
// SELECT max(ee2.revision) FROM middleEntity ee2
|
||||
QueryBuilder maxEeRevQb = rootQueryBuilder.newSubQueryBuilder(versionsMiddleEntityName, "ee2");
|
||||
QueryBuilder maxEeRevQb = rootQueryBuilder.newSubQueryBuilder(versionsMiddleEntityName, MIDDLE_ENTITY_ALIAS_DEF_AUD_STR);
|
||||
maxEeRevQb.addProjection("max", revisionPropertyPath, false);
|
||||
// WHERE
|
||||
Parameters maxEeRevQbParameters = maxEeRevQb.getRootParameters();
|
||||
// ee2.revision <= :revision
|
||||
maxEeRevQbParameters.addWhereWithNamedParam(revisionPropertyPath, "<=", "revision");
|
||||
maxEeRevQbParameters.addWhereWithNamedParam(revisionPropertyPath, "<=", REVISION_PARAMETER);
|
||||
// ee2.originalId.* = ee.originalId.*
|
||||
String ee2OriginalIdPropertyPath = "ee2." + originalIdPropertyName;
|
||||
String ee2OriginalIdPropertyPath = MIDDLE_ENTITY_ALIAS_DEF_AUD_STR + "." + originalIdPropertyName;
|
||||
referencingIdData.getPrefixedMapper().addIdsEqualToQuery(maxEeRevQbParameters, eeOriginalIdPropertyPath, ee2OriginalIdPropertyPath);
|
||||
for (MiddleComponentData componentData : componentDatas) {
|
||||
componentData.getComponentMapper().addMiddleEqualToQuery(maxEeRevQbParameters, eeOriginalIdPropertyPath, ee2OriginalIdPropertyPath);
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
package org.hibernate.envers.strategy;
|
||||
|
||||
import static org.hibernate.envers.entities.mapper.relation.query.QueryConstants.*;
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.hibernate.LockOptions;
|
||||
import org.hibernate.Session;
|
||||
import org.hibernate.envers.RevisionType;
|
||||
|
@ -64,7 +65,7 @@ public class ValidityAuditStrategy implements AuditStrategy {
|
|||
select e from audited_ent e where e.end_rev is null and e.id = :id
|
||||
*/
|
||||
|
||||
QueryBuilder qb = new QueryBuilder(auditedEntityName, "e");
|
||||
QueryBuilder qb = new QueryBuilder(auditedEntityName, MIDDLE_ENTITY_ALIAS);
|
||||
|
||||
// e.id = :id
|
||||
IdMapper idMapper = auditCfg.getEntCfg().get(entityName).getIdMapper();
|
||||
|
@ -87,7 +88,7 @@ public class ValidityAuditStrategy implements AuditStrategy {
|
|||
public void performCollectionChange(Session session, AuditConfiguration auditCfg,
|
||||
PersistentCollectionChangeData persistentCollectionChangeData, Object revision) {
|
||||
|
||||
final QueryBuilder qb = new QueryBuilder(persistentCollectionChangeData.getEntityName(), "e");
|
||||
final QueryBuilder qb = new QueryBuilder(persistentCollectionChangeData.getEntityName(), MIDDLE_ENTITY_ALIAS);
|
||||
|
||||
// Adding a parameter for each id component, except the rev number
|
||||
final String originalIdPropName = auditCfg.getAuditEntCfg().getOriginalIdPropName();
|
||||
|
@ -146,8 +147,8 @@ public class ValidityAuditStrategy implements AuditStrategy {
|
|||
|
||||
// e.revision <= _revision and (e.endRevision > _revision or e.endRevision is null)
|
||||
Parameters subParm = rootParameters.addSubParameters("or");
|
||||
rootParameters.addWhereWithNamedParam(revisionProperty, addAlias, "<=", "revision");
|
||||
subParm.addWhereWithNamedParam(revisionEndProperty + ".id", addAlias, ">", "revision");
|
||||
rootParameters.addWhereWithNamedParam(revisionProperty, addAlias, "<=", REVISION_PARAMETER);
|
||||
subParm.addWhereWithNamedParam(revisionEndProperty + ".id", addAlias, ">", REVISION_PARAMETER);
|
||||
subParm.addWhere(revisionEndProperty, addAlias, "is", "null", false);
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,74 @@
|
|||
package ee.estonia.entities;
|
||||
|
||||
import org.hibernate.envers.Audited;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.Id;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com)
|
||||
*/
|
||||
@Entity
|
||||
@Audited
|
||||
public class Child implements Serializable {
|
||||
@Id
|
||||
@GeneratedValue
|
||||
private Long id;
|
||||
|
||||
private String data;
|
||||
|
||||
public Child() {
|
||||
}
|
||||
|
||||
public Child(String data) {
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
public Child(String data, Long id) {
|
||||
this.id = id;
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (!(o instanceof Child)) return false;
|
||||
|
||||
Child that = (Child) o;
|
||||
|
||||
if (data != null ? !data.equals(that.data) : that.data != null) return false;
|
||||
if (id != null ? !id.equals(that.id) : that.id != null) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = id != null ? id.hashCode() : 0;
|
||||
result = 31 * result + (data != null ? data.hashCode() : 0);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Child(id = " + id + ", data = " + data + ")";
|
||||
}
|
||||
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Long id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getData() {
|
||||
return data;
|
||||
}
|
||||
|
||||
public void setData(String data) {
|
||||
this.data = data;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,88 @@
|
|||
package ee.estonia.entities;
|
||||
|
||||
import org.hibernate.envers.Audited;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.OneToMany;
|
||||
import java.io.Serializable;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com)
|
||||
*/
|
||||
@Entity
|
||||
@Audited
|
||||
public class Parent implements Serializable {
|
||||
@Id
|
||||
@GeneratedValue
|
||||
private Long id;
|
||||
|
||||
private String data;
|
||||
|
||||
@OneToMany
|
||||
private Set<Child> collection = new HashSet<Child>();
|
||||
|
||||
public Parent() {
|
||||
}
|
||||
|
||||
public Parent(String data) {
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
public Parent(String data, Long id) {
|
||||
this.id = id;
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (!(o instanceof Parent)) return false;
|
||||
|
||||
Parent that = (Parent) o;
|
||||
|
||||
if (data != null ? !data.equals(that.data) : that.data != null) return false;
|
||||
if (id != null ? !id.equals(that.id) : that.id != null) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = id != null ? id.hashCode() : 0;
|
||||
result = 31 * result + (data != null ? data.hashCode() : 0);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Parent(id = " + id + ", data = " + data + ")";
|
||||
}
|
||||
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Long id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getData() {
|
||||
return data;
|
||||
}
|
||||
|
||||
public void setData(String data) {
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
public Set<Child> getCollection() {
|
||||
return collection;
|
||||
}
|
||||
|
||||
public void setCollection(Set<Child> collection) {
|
||||
this.collection = collection;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
package org.hibernate.envers.test.integration.naming;
|
||||
|
||||
import ee.estonia.entities.Child;
|
||||
import ee.estonia.entities.Parent;
|
||||
import org.hibernate.ejb.Ejb3Configuration;
|
||||
import org.hibernate.envers.test.AbstractEntityTest;
|
||||
import org.hibernate.envers.test.Priority;
|
||||
import org.hibernate.envers.test.tools.TestTools;
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
|
||||
/**
|
||||
* @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com)
|
||||
*/
|
||||
@TestForIssue(jiraKey = "HHH-6738")
|
||||
public class EstonianTableAlias extends AbstractEntityTest {
|
||||
private Long parentId = null;
|
||||
private Long childId = null;
|
||||
|
||||
public void configure(Ejb3Configuration cfg) {
|
||||
cfg.addAnnotatedClass(Parent.class);
|
||||
cfg.addAnnotatedClass(Child.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Priority(10)
|
||||
public void initData() {
|
||||
EntityManager em = getEntityManager();
|
||||
|
||||
// Revision 1
|
||||
em.getTransaction().begin();
|
||||
Parent parent = new Parent("parent");
|
||||
Child child = new Child("child");
|
||||
parent.getCollection().add(child);
|
||||
em.persist(child);
|
||||
em.persist(parent);
|
||||
em.getTransaction().commit();
|
||||
|
||||
parentId = parent.getId();
|
||||
childId = child.getId();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAuditChildTableAlias() {
|
||||
Parent parent = new Parent("parent", parentId);
|
||||
Child child = new Child("child", childId);
|
||||
|
||||
Parent ver1 = getAuditReader().find(Parent.class, parentId, 1);
|
||||
|
||||
Assert.assertEquals(parent, ver1);
|
||||
Assert.assertEquals(TestTools.makeSet(child), ver1.getCollection());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue