[hibernate-commits] Hibernate SVN: r16503 - in core/branches/envers-hibernate-3.3/src: main/java/org/hibernate/envers/configuration and 11 other directories.
hibernate-commits at lists.jboss.org
hibernate-commits at lists.jboss.org
Sun May 3 13:21:47 EDT 2009
Author: adamw
Date: 2009-05-03 13:21:46 -0400 (Sun, 03 May 2009)
New Revision: 16503
Added:
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/PrimitiveTestEntity.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/reventity/CustomDataRevEntity.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/primitive/
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/primitive/PrimitiveAddDelete.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/CustomNoListener.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/ExceptionListener.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/ExceptionListenerRevEntity.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/TestExceptionRevisionListener.java
Removed:
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/primitive/PrimitiveAddDelete.java
Modified:
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/AuditReader.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/RevisionInfoConfiguration.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/MetadataTools.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/SinglePropertyMapper.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/reader/AuditReaderImpl.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/revisioninfo/DefaultRevisionInfoGenerator.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/revisioninfo/RevisionInfoGenerator.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/synchronization/AuditSync.java
core/branches/envers-hibernate-3.3/src/test/resources/testng.xml
Log:
svn merge -r 16393:16502 https://svn.jboss.org/repos/hibernate/core/trunk/envers .
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/AuditReader.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/AuditReader.java 2009-05-03 13:57:41 UTC (rev 16502)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/AuditReader.java 2009-05-03 17:21:46 UTC (rev 16503)
@@ -100,6 +100,20 @@
<T> T findRevision(Class<T> revisionEntityClass, Number revision) throws IllegalArgumentException,
RevisionDoesNotExistException, IllegalStateException;
+ /**
+ * Gets an instance of the current revision entity, to which any entries in the audit tables will be bound.
+ * Please note the if {@code persist} is {@code false}, and no audited entities are modified in this session,
+ * then the obtained revision entity instance won't be persisted. If {@code persist} is {@code true}, the revision
+ * entity instance will always be persisted, regardless of whether audited entities are changed or not.
+ * @param revisionEntityClass Class of the revision entity. Should be annotated with {@link RevisionEntity}.
+ * @param persist If the revision entity is not yet persisted, should it become persisted. This way, the primary
+ * identifier (id) will be filled (if it's assigned by the DB) and available, but the revision entity will be
+ * persisted even if there are no changes to audited entities. Otherwise, the revision number (id) can be
+ * {@code null}.
+ * @return The current revision entity, to which any entries in the audit tables will be bound.
+ */
+ <T> T getCurrentRevision(Class<T> revisionEntityClass, boolean persist);
+
/**
*
* @return A query creator, associated with this AuditReader instance, with which queries can be
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/RevisionInfoConfiguration.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/RevisionInfoConfiguration.java 2009-05-03 13:57:41 UTC (rev 16502)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/RevisionInfoConfiguration.java 2009-05-03 17:21:46 UTC (rev 16503)
@@ -76,11 +76,11 @@
Element idProperty = MetadataTools.addNativelyGeneratedId(class_mapping, revisionInfoIdData.getName(),
revisionPropType);
- MetadataTools.addColumn(idProperty, "REV", null);
+ MetadataTools.addColumn(idProperty, "REV", null, 0, 0, null);
Element timestampProperty = MetadataTools.addProperty(class_mapping, revisionInfoTimestampData.getName(),
revisionInfoTimestampType, true, false);
- MetadataTools.addColumn(timestampProperty, "REVTSTMP", null);
+ MetadataTools.addColumn(timestampProperty, "REVTSTMP", null, 0, 0, null);
return document;
}
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java 2009-05-03 13:57:41 UTC (rev 16502)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java 2009-05-03 17:21:46 UTC (rev 16503)
@@ -90,7 +90,7 @@
void addRevisionInfoRelation(Element any_mapping) {
Element rev_mapping = (Element) revisionInfoRelationMapping.clone();
rev_mapping.addAttribute("name", verEntCfg.getRevisionFieldName());
- MetadataTools.addColumn(rev_mapping, verEntCfg.getRevisionFieldName(), null);
+ MetadataTools.addColumn(rev_mapping, verEntCfg.getRevisionFieldName(), null, 0, 0, null);
any_mapping.add(rev_mapping);
}
@@ -197,7 +197,7 @@
Element joinKey = joinElement.addElement("key");
MetadataTools.addColumns(joinKey, join.getKey().getColumnIterator());
- MetadataTools.addColumn(joinKey, verEntCfg.getRevisionFieldName(), null);
+ MetadataTools.addColumn(joinKey, verEntCfg.getRevisionFieldName(), null, 0, 0, null);
}
}
@@ -337,7 +337,7 @@
// Adding the "key" element with all columns + the revision number column
Element keyMapping = mappingData.getFirst().addElement("key");
MetadataTools.addColumns(keyMapping, pc.getIdentifierProperty().getColumnIterator());
- MetadataTools.addColumn(keyMapping, verEntCfg.getRevisionFieldName(), null);
+ MetadataTools.addColumn(keyMapping, verEntCfg.getRevisionFieldName(), null, 0, 0, null);
break;
case TABLE_PER_CLASS:
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/MetadataTools.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/MetadataTools.java 2009-05-03 13:57:41 UTC (rev 16502)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/MetadataTools.java 2009-05-03 17:21:46 UTC (rev 16503)
@@ -68,13 +68,23 @@
return prop_mapping;
}
- public static Element addColumn(Element parent, String name, Integer length) {
+ public static Element addColumn(Element parent, String name, Integer length, Integer scale, Integer precision,
+ String sqlType) {
Element column_mapping = parent.addElement("column");
column_mapping.addAttribute("name", name);
if (length != null) {
column_mapping.addAttribute("length", length.toString());
}
+ if (scale != 0) {
+ column_mapping.addAttribute("scale", Integer.toString(scale));
+ }
+ if (precision != 0) {
+ column_mapping.addAttribute("precision", Integer.toString(precision));
+ }
+ if (sqlType != null) {
+ column_mapping.addAttribute("sql-type", sqlType);
+ }
return column_mapping;
}
@@ -142,7 +152,8 @@
public static void addColumns(Element any_mapping, Iterator<Column> columns) {
while (columns.hasNext()) {
Column column = columns.next();
- addColumn(any_mapping, column.getName(), column.getLength());
+ addColumn(any_mapping, column.getName(), column.getLength(), column.getScale(), column.getPrecision(),
+ column.getSqlType());
}
}
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/SinglePropertyMapper.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/SinglePropertyMapper.java 2009-05-03 13:57:41 UTC (rev 16502)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/SinglePropertyMapper.java 2009-05-03 17:21:46 UTC (rev 16503)
@@ -36,7 +36,9 @@
import org.hibernate.collection.PersistentCollection;
import org.hibernate.property.Setter;
+import org.hibernate.property.DirectPropertyAccessor;
import org.hibernate.engine.SessionImplementor;
+import org.hibernate.HibernateException;
/**
* TODO: diff
@@ -68,9 +70,27 @@
}
Setter setter = ReflectionTools.getSetter(obj.getClass(), propertyData);
- setter.set(obj, data.get(propertyData.getName()), null);
+ Object value = data.get(propertyData.getName());
+ // We only set a null value if the field is not primite. Otherwise, we leave it intact.
+ if (value != null || !isPrimitive(setter, propertyData, obj.getClass())) {
+ setter.set(obj, value, null);
+ }
}
+ private boolean isPrimitive(Setter setter, PropertyData propertyData, Class<?> cls) {
+ if (setter instanceof DirectPropertyAccessor.DirectSetter) {
+ // In a direct setter, getMethod() returns null
+ // Trying to look up the field
+ try {
+ return cls.getDeclaredField(propertyData.getBeanName()).getType().isPrimitive();
+ } catch (NoSuchFieldException e) {
+ throw new HibernateException(e);
+ }
+ } else {
+ return setter.getMethod().getParameterTypes()[0].isPrimitive();
+ }
+ }
+
public List<PersistentCollectionChangeData> mapCollectionChanges(String referencingPropertyName,
PersistentCollection newColl,
Serializable oldColl,
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/reader/AuditReaderImpl.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/reader/AuditReaderImpl.java 2009-05-03 13:57:41 UTC (rev 16502)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/reader/AuditReaderImpl.java 2009-05-03 17:21:46 UTC (rev 16503)
@@ -34,10 +34,12 @@
import org.hibernate.envers.query.AuditEntity;
import static org.hibernate.envers.tools.ArgumentsTools.checkNotNull;
import static org.hibernate.envers.tools.ArgumentsTools.checkPositive;
+import org.hibernate.envers.synchronization.AuditSync;
import org.hibernate.NonUniqueResultException;
import org.hibernate.Query;
import org.hibernate.Session;
+import org.hibernate.event.EventSource;
import org.hibernate.engine.SessionImplementor;
import org.jboss.envers.query.VersionsQueryCreator;
@@ -190,7 +192,20 @@
}
}
- public VersionsQueryCreator createQuery() {
+ @SuppressWarnings({"unchecked"})
+ public <T> T getCurrentRevision(Class<T> revisionEntityClass, boolean persist) {
+ if (!(session instanceof EventSource)) {
+ throw new IllegalArgumentException("The provided session is not an EventSource!");
+ }
+
+ // Obtaining the current audit sync
+ AuditSync auditSync = verCfg.getSyncManager().get((EventSource) session);
+
+ // And getting the current revision data
+ return (T) auditSync.getCurrentRevisionData(session, persist);
+ }
+
+ public VersionsQueryCreator createQuery() {
return new VersionsQueryCreator(verCfg, this);
}
}
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/revisioninfo/DefaultRevisionInfoGenerator.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/revisioninfo/DefaultRevisionInfoGenerator.java 2009-05-03 13:57:41 UTC (rev 16502)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/revisioninfo/DefaultRevisionInfoGenerator.java 2009-05-03 17:21:46 UTC (rev 16503)
@@ -63,14 +63,18 @@
}
}
- private Object newRevision() {
- Object revisionInfo;
+ public void saveRevisionData(Session session, Object revisionData) {
+ session.save(revisionInfoEntityName, revisionData);
+ }
+
+ public Object generate() {
+ Object revisionInfo;
try {
revisionInfo = revisionInfoClass.newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
-
+
revisionTimestampSetter.set(revisionInfo, System.currentTimeMillis(), null);
if (listener != null) {
@@ -79,10 +83,4 @@
return revisionInfo;
}
-
- public Object generate(Session session) {
- Object revisionData = newRevision();
- session.save(revisionInfoEntityName, revisionData);
- return revisionData;
- }
}
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/revisioninfo/RevisionInfoGenerator.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/revisioninfo/RevisionInfoGenerator.java 2009-05-03 13:57:41 UTC (rev 16502)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/revisioninfo/RevisionInfoGenerator.java 2009-05-03 17:21:46 UTC (rev 16503)
@@ -29,5 +29,6 @@
* @author Adam Warski (adam at warski dot org)
*/
public interface RevisionInfoGenerator {
- Object generate(Session session);
+ void saveRevisionData(Session session, Object revisionData);
+ Object generate();
}
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/synchronization/AuditSync.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/synchronization/AuditSync.java 2009-05-03 13:57:41 UTC (rev 16502)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/synchronization/AuditSync.java 2009-05-03 17:21:46 UTC (rev 16503)
@@ -111,9 +111,8 @@
}
private void executeInSession(Session session) {
- if (revisionData == null) {
- revisionData = revisionInfoGenerator.generate(session);
- }
+ // Making sure the revision data is persisted.
+ getCurrentRevisionData(session, true);
AuditWorkUnit vwu;
@@ -127,31 +126,51 @@
}
}
+ public Object getCurrentRevisionData(Session session, boolean persist) {
+ // Generating the revision data if not yet generated
+ if (revisionData == null) {
+ revisionData = revisionInfoGenerator.generate();
+ }
+
+ // Saving the revision data, if not yet saved and persist is true
+ if (!session.contains(revisionData) && persist) {
+ revisionInfoGenerator.saveRevisionData(session, revisionData);
+ }
+
+ return revisionData;
+ }
+
public void beforeCompletion() {
if (workUnits.size() == 0 && undoQueue.size() == 0) {
return;
}
- // see: http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4178431
- if (FlushMode.isManualFlushMode(session.getFlushMode()) || session.isClosed()) {
- Session temporarySession = null;
- try {
- temporarySession = session.getFactory().openTemporarySession();
+ try {
+ // see: http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4178431
+ if (FlushMode.isManualFlushMode(session.getFlushMode()) || session.isClosed()) {
+ Session temporarySession = null;
+ try {
+ temporarySession = session.getFactory().openTemporarySession();
- executeInSession(temporarySession);
+ executeInSession(temporarySession);
- temporarySession.flush();
- } finally {
- if (temporarySession != null) {
- temporarySession.close();
- }
- }
- } else {
- executeInSession(session);
+ temporarySession.flush();
+ } finally {
+ if (temporarySession != null) {
+ temporarySession.close();
+ }
+ }
+ } else {
+ executeInSession(session);
- // Explicity flushing the session, as the auto-flush may have already happened.
- session.flush();
- }
+ // Explicity flushing the session, as the auto-flush may have already happened.
+ session.flush();
+ }
+ } catch (RuntimeException e) {
+ // Rolling back the transaction in case of any exceptions
+ session.getTransaction().rollback();
+ throw e;
+ }
}
public void afterCompletion(int i) {
Copied: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/PrimitiveTestEntity.java (from rev 16502, core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/PrimitiveTestEntity.java)
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/PrimitiveTestEntity.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/PrimitiveTestEntity.java 2009-05-03 17:21:46 UTC (rev 16503)
@@ -0,0 +1,109 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.envers.test.entities;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Entity
+public class PrimitiveTestEntity {
+ @Id
+ @GeneratedValue
+ private Integer id;
+
+ @Audited
+ private int number;
+
+ private int number2;
+
+ public PrimitiveTestEntity() {
+ }
+
+ public PrimitiveTestEntity(int number, int number2) {
+ this.number = number;
+ this.number2 = number2;
+ }
+
+ public PrimitiveTestEntity(Integer id, int number, int number2) {
+ this.id = id;
+ this.number = number;
+ this.number2 = number2;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Integer getNumber() {
+ return number;
+ }
+
+ public void setNumber(Integer number) {
+ this.number = number;
+ }
+
+ public int getNumber2() {
+ return number2;
+ }
+
+ public void setNumber2(int number2) {
+ this.number2 = number2;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof PrimitiveTestEntity)) return false;
+
+ PrimitiveTestEntity that = (PrimitiveTestEntity) o;
+
+ if (number != that.number) return false;
+ if (number2 != that.number2) 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 + number;
+ result = 31 * result + number2;
+ return result;
+ }
+
+ public String toString() {
+ return "PTE(id = " + id + ", number = " + number + ", number2 = " + number2 + ")";
+ }
+}
\ No newline at end of file
Copied: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/reventity/CustomDataRevEntity.java (from rev 16502, core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/reventity/CustomDataRevEntity.java)
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/reventity/CustomDataRevEntity.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/reventity/CustomDataRevEntity.java 2009-05-03 17:21:46 UTC (rev 16503)
@@ -0,0 +1,95 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.envers.test.entities.reventity;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.envers.RevisionEntity;
+import org.hibernate.envers.RevisionNumber;
+import org.hibernate.envers.RevisionTimestamp;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Entity
+ at RevisionEntity
+public class CustomDataRevEntity {
+ @Id
+ @GeneratedValue
+ @RevisionNumber
+ private int customId;
+
+ @RevisionTimestamp
+ private long customTimestamp;
+
+ private String data;
+
+ public int getCustomId() {
+ return customId;
+ }
+
+ public void setCustomId(int customId) {
+ this.customId = customId;
+ }
+
+ public long getCustomTimestamp() {
+ return customTimestamp;
+ }
+
+ public void setCustomTimestamp(long customTimestamp) {
+ this.customTimestamp = customTimestamp;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof CustomDataRevEntity)) return false;
+
+ CustomDataRevEntity that = (CustomDataRevEntity) o;
+
+ if (customId != that.customId) return false;
+ if (customTimestamp != that.customTimestamp) return false;
+ if (data != null ? !data.equals(that.data) : that.data != null) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = customId;
+ result = 31 * result + (int) (customTimestamp ^ (customTimestamp >>> 32));
+ result = 31 * result + (data != null ? data.hashCode() : 0);
+ return result;
+ }
+}
\ No newline at end of file
Copied: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/primitive (from rev 16502, core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/primitive)
Deleted: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/primitive/PrimitiveAddDelete.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/primitive/PrimitiveAddDelete.java 2009-05-03 13:57:41 UTC (rev 16502)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/primitive/PrimitiveAddDelete.java 2009-05-03 17:21:46 UTC (rev 16503)
@@ -1,97 +0,0 @@
-/*
- * Hibernate, Relational Persistence for Idiomatic Java
- *
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors. All third-party contributions are
- * distributed under license by Red Hat Middleware LLC.
- *
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA 02110-1301 USA
- */
-package org.hibernate.envers.test.integration.primitive;
-
-import java.util.Arrays;
-import java.util.List;
-import javax.persistence.EntityManager;
-
-import org.hibernate.envers.test.AbstractEntityTest;
-import org.hibernate.envers.test.entities.PrimitiveTestEntity;
-import org.testng.annotations.Test;
-
-import org.hibernate.ejb.Ejb3Configuration;
-
-/**
- * @author Adam Warski (adam at warski dot org)
- */
-public class PrimitiveAddDelete extends AbstractEntityTest {
- private Integer id1;
-
- public void configure(Ejb3Configuration cfg) {
- cfg.addAnnotatedClass(PrimitiveTestEntity.class);
- }
-
- @Test
- public void initData() {
- EntityManager em = getEntityManager();
-
- // Revision 1
- em.getTransaction().begin();
- PrimitiveTestEntity pte = new PrimitiveTestEntity(10, 11);
- em.persist(pte);
- id1 = pte.getId();
- em.getTransaction().commit();
-
- // Revision 2
- em.getTransaction().begin();
- pte = em.find(PrimitiveTestEntity.class, id1);
- pte.setNumber(20);
- pte.setNumber2(21);
- em.getTransaction().commit();
-
- // Revision 3
- em.getTransaction().begin();
- pte = em.find(PrimitiveTestEntity.class, id1);
- em.remove(pte);
- em.getTransaction().commit();
- }
-
- @Test(dependsOnMethods = "initData")
- public void testRevisionsCounts() {
- assert Arrays.asList(1, 2, 3).equals(getAuditReader().getRevisions(PrimitiveTestEntity.class, id1));
- }
-
- @Test(dependsOnMethods = "initData")
- public void testHistoryOfId1() {
- PrimitiveTestEntity ver1 = new PrimitiveTestEntity(id1, 10, 0);
- PrimitiveTestEntity ver2 = new PrimitiveTestEntity(id1, 20, 0);
-
- assert getAuditReader().find(PrimitiveTestEntity.class, id1, 1).equals(ver1);
- assert getAuditReader().find(PrimitiveTestEntity.class, id1, 2).equals(ver2);
- assert getAuditReader().find(PrimitiveTestEntity.class, id1, 3) == null;
- }
-
- @Test(dependsOnMethods = "initData")
- public void testQueryWithDeleted() {
- // Selecting all entities, also the deleted ones
- List entities = getAuditReader().createQuery().forRevisionsOfEntity(PrimitiveTestEntity.class, true, true)
- .getResultList();
-
- assert entities.size() == 3;
- assert entities.get(0).equals(new PrimitiveTestEntity(id1, 10, 0));
- assert entities.get(1).equals(new PrimitiveTestEntity(id1, 20, 0));
- assert entities.get(2).equals(new PrimitiveTestEntity(id1, 0, 0));
- }
-}
\ No newline at end of file
Copied: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/primitive/PrimitiveAddDelete.java (from rev 16502, core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/primitive/PrimitiveAddDelete.java)
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/primitive/PrimitiveAddDelete.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/primitive/PrimitiveAddDelete.java 2009-05-03 17:21:46 UTC (rev 16503)
@@ -0,0 +1,97 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.envers.test.integration.primitive;
+
+import java.util.Arrays;
+import java.util.List;
+import javax.persistence.EntityManager;
+
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.hibernate.envers.test.entities.PrimitiveTestEntity;
+import org.testng.annotations.Test;
+
+import org.hibernate.ejb.Ejb3Configuration;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class PrimitiveAddDelete extends AbstractEntityTest {
+ private Integer id1;
+
+ public void configure(Ejb3Configuration cfg) {
+ cfg.addAnnotatedClass(PrimitiveTestEntity.class);
+ }
+
+ @Test
+ public void initData() {
+ EntityManager em = getEntityManager();
+
+ // Revision 1
+ em.getTransaction().begin();
+ PrimitiveTestEntity pte = new PrimitiveTestEntity(10, 11);
+ em.persist(pte);
+ id1 = pte.getId();
+ em.getTransaction().commit();
+
+ // Revision 2
+ em.getTransaction().begin();
+ pte = em.find(PrimitiveTestEntity.class, id1);
+ pte.setNumber(20);
+ pte.setNumber2(21);
+ em.getTransaction().commit();
+
+ // Revision 3
+ em.getTransaction().begin();
+ pte = em.find(PrimitiveTestEntity.class, id1);
+ em.remove(pte);
+ em.getTransaction().commit();
+ }
+
+ @Test(dependsOnMethods = "initData")
+ public void testRevisionsCounts() {
+ assert Arrays.asList(1, 2, 3).equals(getAuditReader().getRevisions(PrimitiveTestEntity.class, id1));
+ }
+
+ @Test(dependsOnMethods = "initData")
+ public void testHistoryOfId1() {
+ PrimitiveTestEntity ver1 = new PrimitiveTestEntity(id1, 10, 0);
+ PrimitiveTestEntity ver2 = new PrimitiveTestEntity(id1, 20, 0);
+
+ assert getAuditReader().find(PrimitiveTestEntity.class, id1, 1).equals(ver1);
+ assert getAuditReader().find(PrimitiveTestEntity.class, id1, 2).equals(ver2);
+ assert getAuditReader().find(PrimitiveTestEntity.class, id1, 3) == null;
+ }
+
+ @Test(dependsOnMethods = "initData")
+ public void testQueryWithDeleted() {
+ // Selecting all entities, also the deleted ones
+ List entities = getAuditReader().createQuery().forRevisionsOfEntity(PrimitiveTestEntity.class, true, true)
+ .getResultList();
+
+ assert entities.size() == 3;
+ assert entities.get(0).equals(new PrimitiveTestEntity(id1, 10, 0));
+ assert entities.get(1).equals(new PrimitiveTestEntity(id1, 20, 0));
+ assert entities.get(2).equals(new PrimitiveTestEntity(id1, 0, 0));
+ }
+}
\ No newline at end of file
Copied: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/CustomNoListener.java (from rev 16502, core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/reventity/CustomNoListener.java)
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/CustomNoListener.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/CustomNoListener.java 2009-05-03 17:21:46 UTC (rev 16503)
@@ -0,0 +1,137 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.envers.test.integration.reventity;
+
+import java.util.Arrays;
+import java.util.Date;
+import javax.persistence.EntityManager;
+
+import org.hibernate.envers.AuditReader;
+import org.hibernate.envers.exception.RevisionDoesNotExistException;
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.hibernate.envers.test.entities.StrTestEntity;
+import org.hibernate.envers.test.entities.reventity.CustomDataRevEntity;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import org.hibernate.ejb.Ejb3Configuration;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class CustomNoListener extends AbstractEntityTest {
+ private Integer id;
+
+ public void configure(Ejb3Configuration cfg) {
+ cfg.addAnnotatedClass(StrTestEntity.class);
+ cfg.addAnnotatedClass(CustomDataRevEntity.class);
+ }
+
+ @BeforeClass(dependsOnMethods = "init")
+ public void initData() throws InterruptedException {
+ EntityManager em = getEntityManager();
+
+ // Revision 1
+ em.getTransaction().begin();
+ StrTestEntity te = new StrTestEntity("x");
+ em.persist(te);
+ id = te.getId();
+
+ // Setting the data on the revision entity
+ CustomDataRevEntity custom = getAuditReader().getCurrentRevision(CustomDataRevEntity.class, false);
+ custom.setData("data1");
+
+ em.getTransaction().commit();
+
+ // Revision 2
+ em.getTransaction().begin();
+ te = em.find(StrTestEntity.class, id);
+ te.setStr("y");
+
+ // Setting the data on the revision entity
+ custom = getAuditReader().getCurrentRevision(CustomDataRevEntity.class, false);
+ custom.setData("data2");
+
+ em.getTransaction().commit();
+
+ // Revision 3 - no changes, but rev entity should be persisted
+ em.getTransaction().begin();
+
+ // Setting the data on the revision entity
+ custom = getAuditReader().getCurrentRevision(CustomDataRevEntity.class, true);
+ custom.setData("data3");
+
+ em.getTransaction().commit();
+
+ // No changes, rev entity won't be persisted
+ em.getTransaction().begin();
+
+ // Setting the data on the revision entity
+ custom = getAuditReader().getCurrentRevision(CustomDataRevEntity.class, false);
+ custom.setData("data4");
+
+ em.getTransaction().commit();
+
+ // Revision 4
+ em.getTransaction().begin();
+ te = em.find(StrTestEntity.class, id);
+ te.setStr("z");
+
+ // Setting the data on the revision entity
+ custom = getAuditReader().getCurrentRevision(CustomDataRevEntity.class, false);
+ custom.setData("data5");
+
+ custom = getAuditReader().getCurrentRevision(CustomDataRevEntity.class, false);
+ custom.setData("data5bis");
+
+ em.getTransaction().commit();
+ }
+
+ @Test
+ public void testFindRevision() {
+ AuditReader vr = getAuditReader();
+
+ assert "data1".equals(vr.findRevision(CustomDataRevEntity.class, 1).getData());
+ assert "data2".equals(vr.findRevision(CustomDataRevEntity.class, 2).getData());
+ assert "data3".equals(vr.findRevision(CustomDataRevEntity.class, 3).getData());
+ assert "data5bis".equals(vr.findRevision(CustomDataRevEntity.class, 4).getData());
+ }
+
+ @Test
+ public void testRevisionsCounts() {
+ assert Arrays.asList(1, 2, 4).equals(getAuditReader().getRevisions(StrTestEntity.class, id));
+ }
+
+ @Test
+ public void testHistoryOfId1() {
+ StrTestEntity ver1 = new StrTestEntity("x", id);
+ StrTestEntity ver2 = new StrTestEntity("y", id);
+ StrTestEntity ver3 = new StrTestEntity("z", id);
+
+ assert getAuditReader().find(StrTestEntity.class, id, 1).equals(ver1);
+ assert getAuditReader().find(StrTestEntity.class, id, 2).equals(ver2);
+ assert getAuditReader().find(StrTestEntity.class, id, 3).equals(ver2);
+ assert getAuditReader().find(StrTestEntity.class, id, 4).equals(ver3);
+ }
+}
\ No newline at end of file
Copied: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/ExceptionListener.java (from rev 16502, core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/reventity/ExceptionListener.java)
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/ExceptionListener.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/ExceptionListener.java 2009-05-03 17:21:46 UTC (rev 16503)
@@ -0,0 +1,60 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.envers.test.integration.reventity;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.hibernate.envers.test.entities.StrTestEntity;
+import org.testng.annotations.Test;
+
+import org.hibernate.ejb.Ejb3Configuration;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class ExceptionListener extends AbstractEntityTest {
+ public void configure(Ejb3Configuration cfg) {
+ cfg.addAnnotatedClass(StrTestEntity.class);
+ cfg.addAnnotatedClass(ExceptionListenerRevEntity.class);
+ }
+
+ @Test
+ public void testTransactionRollback() throws InterruptedException {
+ // Trying to persist an entity - however the listener should throw an exception, so the entity
+ // shouldn't be persisted
+ EntityManager em = getEntityManager();
+ em.getTransaction().begin();
+ StrTestEntity te = new StrTestEntity("x");
+ em.persist(te);
+ em.getTransaction().commit();
+
+ // Checking if the entity became persisted
+ em = getEntityManager();
+ em.getTransaction().begin();
+ Long count = (Long) em.createQuery("select count(s) from StrTestEntity s where s.str = 'x'").getSingleResult();
+ assert count == 0l;
+ em.getTransaction().commit();
+ }
+}
\ No newline at end of file
Copied: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/ExceptionListenerRevEntity.java (from rev 16502, core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/reventity/ExceptionListenerRevEntity.java)
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/ExceptionListenerRevEntity.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/ExceptionListenerRevEntity.java 2009-05-03 17:21:46 UTC (rev 16503)
@@ -0,0 +1,82 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.envers.test.integration.reventity;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.envers.RevisionEntity;
+import org.hibernate.envers.RevisionNumber;
+import org.hibernate.envers.RevisionTimestamp;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Entity
+ at RevisionEntity(TestExceptionRevisionListener.class)
+public class ExceptionListenerRevEntity {
+ @Id
+ @GeneratedValue
+ @RevisionNumber
+ private int id;
+
+ @RevisionTimestamp
+ private long timestamp;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public long getTimestamp() {
+ return timestamp;
+ }
+
+ public void setTimestamp(long timestamp) {
+ this.timestamp = timestamp;
+ }
+
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof ExceptionListenerRevEntity)) return false;
+
+ ExceptionListenerRevEntity revEntity = (ExceptionListenerRevEntity) o;
+
+ if (id != revEntity.id) return false;
+ if (timestamp != revEntity.timestamp) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = id;
+ result = 31 * result + (int) (timestamp ^ (timestamp >>> 32));
+ return result;
+ }
+}
\ No newline at end of file
Copied: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/TestExceptionRevisionListener.java (from rev 16502, core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/reventity/TestExceptionRevisionListener.java)
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/TestExceptionRevisionListener.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/TestExceptionRevisionListener.java 2009-05-03 17:21:46 UTC (rev 16503)
@@ -0,0 +1,35 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.envers.test.integration.reventity;
+
+import org.hibernate.envers.RevisionListener;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class TestExceptionRevisionListener implements RevisionListener {
+ public void newRevision(Object revisionEntity) {
+ throw new RuntimeException();
+ }
+}
\ No newline at end of file
Modified: core/branches/envers-hibernate-3.3/src/test/resources/testng.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/testng.xml 2009-05-03 13:57:41 UTC (rev 16502)
+++ core/branches/envers-hibernate-3.3/src/test/resources/testng.xml 2009-05-03 17:21:46 UTC (rev 16503)
@@ -42,6 +42,7 @@
<package name="org.hibernate.envers.test.integration.onetoone.bidirectional" />
<package name="org.hibernate.envers.test.integration.onetoone.bidirectional.ids" />
<package name="org.hibernate.envers.test.integration.onetoone.unidirectional" />
+ <package name="org.hibernate.envers.test.integration.primitive" />
<package name="org.hibernate.envers.test.integration.properties" />
<package name="org.hibernate.envers.test.integration.query" />
<package name="org.hibernate.envers.test.integration.query.ids" />
More information about the hibernate-commits
mailing list