Hi All, I test the code from Hibernate 4.2.1 and 4.2.6Final in the auditReader , It generate the sql seem for the child's REV for delete action is not treat as insert and update action. below the generated result {code} /* select e__ from tpdrg.Child_AUD e__ where e__.parent_name = :parent_name and ( ( e__.originalId.REV.id = ( select max(e2__.originalId.REV.id) from tpdrg.Child_AUD e2__ where e2__.originalId.REV.id <= :revision and e__.originalId.name = e2__.originalId.name ) and REVTYPE != :delrevisiontype ) or ( originalId.REV.id = :revision and REVTYPE = :delrevisiontype ) ) */ select child_aud0_.name as name1_1_, child_aud0_.REV as REV2_1_, child_aud0_.REVTYPE as REVTYPE3_1_, child_aud0_.parent_name as parent_n4_1_ from Child_AUD child_aud0_ where child_aud0_.parent_name=? and ( child_aud0_.REV=( select max(child_aud1_.REV) from Child_AUD child_aud1_ where child_aud1_.REV<=? and child_aud0_.name=child_aud1_.name ) and child_aud0_.REVTYPE<>? or child_aud0_.REV=? and child_aud0_.REVTYPE=? ) 03 Dec 2013 16:02:52 [main ] TRACE BasicBinder - binding parameter [1] as [VARCHAR] - Parent 03 Dec 2013 16:02:52 [main ] TRACE BasicBinder - binding parameter [2] as [INTEGER] - 2147483647 03 Dec 2013 16:02:52 [main ] TRACE BasicBinder - binding parameter [3] as [INTEGER] - 2 03 Dec 2013 16:02:52 [main ] TRACE BasicBinder - binding parameter [4] as [INTEGER] - 2147483647 03 Dec 2013 16:02:52 [main ] TRACE BasicBinder - binding parameter [5] as [INTEGER] - 2 {code}
below is the full test case for your reference
{code:title=pom.xml|borderStyle=solid} <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>TestHibernate</groupId> <artifactId>TestHibernate</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>com.googlecode.flyway</groupId> <artifactId>flyway-core</artifactId> <version>2.2.1</version> </dependency>
<dependency> <groupId>net.sourceforge.jtds</groupId> <artifactId>jtds</artifactId> <version>1.2.7</version> </dependency>
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>4.2.6.Final</version> </dependency>
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.2.6.Final</version> </dependency>
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-envers</artifactId> <version>4.2.6.Final</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>3.2.3.RELEASE</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>3.2.3.RELEASE</version> </dependency>
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>1.3.2.RELEASE</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>3.2.3.RELEASE</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.2.3.RELEASE</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>3.2.3.RELEASE</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>3.2.3.RELEASE</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>3.2.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>3.2.3.RELEASE</version> </dependency>
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-core</artifactId> <version>3.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>3.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>3.1.4.RELEASE</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>3.2.3.RELEASE</version> </dependency> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.8.5</version> <scope>test</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.5</version> </dependency>
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.5</version> </dependency> </dependencies> </project> {code}
{code:title=Parent.java|borderStyle=solid} package tpdrg;
import org.hibernate.envers.Audited;
import javax.persistence.*; import java.util.List;
@Entity @Audited public class Parent { private String name;
@Id public String getName() { return name; }
public void setName(String name) { this.name = name; }
private List<Child> child;
@OneToMany(cascade = CascadeType.ALL,mappedBy = "parent",orphanRemoval = true) public List<Child> getChild() { return child; }
public void setChild(List<Child> child) { this.child = child; } } {code}
{code:title=Child.java|borderStyle=solid} package tpdrg;
import org.hibernate.envers.Audited;
import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.ManyToOne;
@Entity @Audited public class Child { private String name;
@Id public String getName() { return name; }
public void setName(String name) { this.name = name; }
private Parent parent;
@ManyToOne public Parent getParent() { return parent; }
public void setParent(Parent parent) { this.parent = parent; } }
{code}
{code:title=Test.java|borderStyle=solid} package tpdrg;
import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.envers.AuditReader; import org.hibernate.envers.AuditReaderFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.testng.AbstractTestNGSpringContextTests; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test;
import java.util.ArrayList; import java.util.List;
@Test @ContextConfiguration(locations = "classpath*:spring-config.xml") public class TEST extends AbstractTestNGSpringContextTests {
@Autowired @Qualifier("Deals") protected org.hibernate.SessionFactory sf;
Session session;
@BeforeMethod public void init() { session = sf.openSession(); }
@AfterMethod public void close() { session.close(); }
@Test public void AddNew(){ Parent p = new Parent(); p.setName("Parent"); ArrayList children = new ArrayList(); for (int i = 0 ; i < 3 ;i++){ Child c = new Child(); c.setName("child "+i); c.setParent(p); children.add(c); } p.setChild(children); Transaction tx = session.getTransaction(); tx.begin(); session.saveOrUpdate(p); tx.commit(); }
@Test(dependsOnMethods = {"AddNew"}) public void Remove(){
Transaction tx = session.getTransaction(); tx.begin(); Parent p = (Parent)session.get(Parent.class,"Parent"); session.delete(p); tx.commit(); }
@Test(dependsOnMethods = {"Remove"}) public void AuditReader(){
Transaction tx = session.getTransaction(); tx.begin();
AuditReader reader = AuditReaderFactory.get(session); Parent deletedObject = reader.find(Parent.class,Parent.class.getName(), "Parent", Integer.MAX_VALUE, true); List<Child> children = (List<Child>)deletedObject.getChild(); assert children.size()>0:"Expect the result should not zero";
tx.commit(); }
{code}
{code:title=spring-config.java|borderStyle=solid} <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver"/> <property name="url" value="jdbc:jtds:sqlserver://topdragon.dyndns.org:14/TTNX21"/> <property name="username" value="sa"/> <property name="password" value="kplus12345"/> </bean>
<bean id="txDeal" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="Deals"/>
</bean>
<bean id="Deals" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties"> <props>
<prop key="hibernate.dialect">org.hibernate.dialect.SQLServer2008Dialect</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.use_sql_comments">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.autoReconnect">true</prop>
<prop key="org.hibernate.envers.store_data_at_delete">true</prop>
</props>
</property>
<property name="packagesToScan"> <list> <value>tpdrg</value>
</list> </property>
</bean>
</beans> {code}
|