Comments (6)
Hi @abid-khan,
it is pretty hard to tell what is causing this without code that reproduces this issue. Can you elaborate code that reproduces this problem reliably? Your UserRepositoryTest
, the User
entity and your UserRepository
could help. What versions of Spring Data JPA, Spring Data Envers and Spring Test do you use? How did you configure the transaction manager?
Are you sure that you understood the exception message "object is not an instance of declaring class"? Do you have any typos in your methods (setters, getters, repository methods, ...)?
from spring-data-envers.
Hi @visusnet
Please find configuration detail below.
Spring version : 4.0.5.RELEASE
Spring data jpa version :1.5.0.RELEASE
Spring data envers:0.2.0.RELEASE
@Configuration
@ComponentScan(basePackages = "com.hazelcast")
@Import({ PropertySourcesPlaceholderConfiguration.class })
public class ApplicationConfiguration {
}
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.hazelcast.repository", repositoryFactoryBeanClass = EnversRevisionRepositoryFactoryBean.class)
@EnableJpaAuditing(auditorAwareRef = "auditorAwareImpl")
@EnableAspectJAutoProxy
@Import({ ApplicationConfiguration.class })
public class PersistenceConfiguration {
@Autowired
private Environment environment;
@Bean
public AbstractEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(this.dataSource());
entityManagerFactoryBean.setPackagesToScan("com.hazelcast.entity");
AbstractJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setGenerateDdl(true);
adapter.setDatabase(Database.MYSQL);
entityManagerFactoryBean.setJpaVendorAdapter(adapter);
entityManagerFactoryBean.setJpaPropertyMap(this.jpaPropertyMap());
entityManagerFactoryBean.setPackagesToScan("com.hazelcast.entity");
return entityManagerFactoryBean;
}
@Bean
public Map<String, ?> jpaPropertyMap() {
Map<String, Object> jpaPropertyMap = new HashMap<String, Object>();
jpaPropertyMap.put("hibernate.show_sql", Boolean
.parseBoolean(environment.getProperty("hibernate.show_sql")));
jpaPropertyMap.put("hibernate.format_sql", Boolean
.parseBoolean(environment.getProperty("hibernate.format_sql")));
jpaPropertyMap.put("hibernate.ejb.naming_strategy",
"org.hibernate.cfg.ImprovedNamingStrategy");
jpaPropertyMap.put("hibernate.connection.charSet", "UTF-8");
jpaPropertyMap.put("hibernate.generate_ddl",
environment.getProperty("hibernate.generate_ddl"));
jpaPropertyMap.put("hibernate.dialect",
environment.getProperty("hibernate.dialect"));
jpaPropertyMap.put("org.hibernate.envers.audit_strategy",
ValidityAuditStrategy.class.getName());
return jpaPropertyMap;
}
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(environment
.getProperty("database.driver"));
dataSource.setUrl(environment.getProperty("database.url"));
dataSource.setUsername(environment.getProperty("database.user"));
dataSource.setPassword(environment.getProperty("database.password"));
return dataSource;
}
@Bean
public PlatformTransactionManager transactionManager() {
JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
// jpaTransactionManager.setEntityManagerFactory(this
// .entityManagerFactory().getObject());
return jpaTransactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
@Bean(initMethod = "migrate")
public Flyway flyway() {
Flyway flyway = new Flyway();
flyway.setDataSource(this.dataSource());
return flyway;
}
@Bean
public AuditorAwareImpl auditorAwareImpl() {
return new AuditorAwareImpl();
}
}
Entity
@SuppressWarnings("serial")
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class AbstractAuditableEntity extends AbstractPersistable<Long> implements Auditable<User, Long> {
@Version
protected Long version;
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
@DateTimeFormat(iso = ISO.DATE_TIME)
protected DateTime createdDate;
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
@DateTimeFormat(iso = ISO.DATE_TIME)
protected DateTime lastModifiedDate;
protected User createdBy;
protected User lastModifiedBy;
@Enumerated(EnumType.STRING)
protected StatusType status;
public Long getVersion() {
return version;
}
public void setVersion(Long version) {
this.version = version;
}
public DateTime getCreatedDate() {
return createdDate;
}
public void setCreatedDate(DateTime createdDate) {
this.createdDate = createdDate;
}
public DateTime getLastModifiedDate() {
return lastModifiedDate;
}
public void setLastModifiedDate(DateTime lastModifiedDate) {
this.lastModifiedDate = lastModifiedDate;
}
public User getCreatedBy() {
return createdBy;
}
public void setCreatedBy(User createdBy) {
this.createdBy = createdBy;
}
public User getLastModifiedBy() {
return lastModifiedBy;
}
public void setLastModifiedBy(User lastModifiedBy) {
this.lastModifiedBy = lastModifiedBy;
}
public StatusType getStatus() {
return status;
}
public void setStatus(StatusType status) {
this.status = status;
}
}
@SuppressWarnings("serial")
@Entity
@Audited
@Table(name = "user")
public class User extends AbstractAuditableEntity {
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
Repository
@Repository
public interface UserRepository extends
RevisionRepository<User, Long, Integer>, JpaRepository<User, Long> {
List<User> findByFirstName(@Param("firstName") String firstName);
}
Test class
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { PersistenceConfiguration.class }, loader = AnnotationConfigContextLoader.class)
@TransactionConfiguration(defaultRollback = false)
public class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
@Transactional
@Test
public void testRevision() {
User user = userRepository.saveAndFlush(getUser());
Assert.notNull(user);
Revision<Integer, User> revison = userRepository
.findLastChangeRevision(user.getId());
Assert.notNull(revison);
Assert.notNull(revison.getEntity());
}
public User getUser() {
User user = new User();
user.setFirstName("abid");
user.setLastName("Khan");
user.setStatus(StatusType.NEW);
return user;
}
}
pom.xml
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.abid.hazelcast</groupId>
<artifactId>hazelcast</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>hazelcast Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<maven.compiler.source>1.6</maven.compiler.source>
<maven.compiler.target>1.6</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>4.0.5.RELEASE</spring.version>
<spring.data.version>1.5.0.RELEASE</spring.data.version>
<spring.security.version>3.2.3.RELEASE</spring.security.version>
<hibernate.version>4.3.5.Final</hibernate.version>
<jackson.version>2.4.0</jackson.version>
<slf4j.version>1.7.7</slf4j.version>
<flyway.version>3.0</flyway.version>
<hazelcast.version>3.2.4</hazelcast.version>
<hazelcast.spring.version>3.2.3</hazelcast.spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>${spring.data.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-envers</artifactId>
<version>0.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-acl</artifactId>
<version>${spring.security.version}</version>
</dependency>
<!-- Hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.2.0.Final</version>
</dependency>
<!-- MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.31</version>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>
<!-- commons -->
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.12.1.GA</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
<scope>runtime</scope>
</dependency>
<!-- Joda time -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>org.jadira.usertype</groupId>
<artifactId>usertype.jodatime</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- flyway -->
<dependency>
<groupId>com.googlecode.flyway</groupId>
<artifactId>flyway-core</artifactId>
<version>1.5</version>
</dependency>
<!-- json -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-joda</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate4</artifactId>
<version>2.1.2</version>
</dependency>
<!-- Cache -->
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast-all</artifactId>
<version>${hazelcast.version}</version>
</dependency>
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast-spring</artifactId>
<version>${hazelcast.spring.version}</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
from spring-data-envers.
I noticed that you are using Spring Data JPA 1.5.0.RELEASE. Before I take a look at your code, I want to make sure that the obvious problem sources are eliminated. Can you please update to 1.6.4.RELEASE and check whether this issue disappears?
from spring-data-envers.
Hi @visusnet
Updating to 1.6.4.RELEASE does remove the exception. But below call returns null. Is any configuration missing from my side?
userRepository
.findLastChangeRevision(user.getId());
from spring-data-envers.
I guess the @Transactional
method is the problem. Auditing entries are written once the transaction is completed. You've annotated your test method so that a test-wide transaction is opened thus no revision information is written until the test completes. This is a common pitfall. There is a (still open @olivergierke ;) ) pull request (#16) that adds tests for transaction handling.
Please take a look at my comment: https://github.com/spring-projects/spring-data-envers/pull/16/files#diff-4fbeee7e3411f27d306c1ed08e4ede89R119
Does a TransactionTemplate
resolve your issue?
from spring-data-envers.
@visusnet
Yes, that is what I also assumed and cross verified. It is working properly. Thanks.
from spring-data-envers.
Related Issues (20)
- Release 2.7.9 (2021.2.9)
- Upgrade to Maven Wrapper 3.9.0
- Envers doesn't support serializing with filters? Could not write JSON: Session/EntityManager is closed / the owning session was closed HOT 2
- Release 2.7.10 (2021.2.10)
- Release 2.7.11 (2021.2.11)
- Upgrade to Maven Wrapper 3.9.1
- Missing Pageable Sort interpretation HOT 3
- Release 2.7.12 (2021.2.12)
- Release 2.7.13 (2021.2.13)
- Use snapshots and milestone repositories instead of libs-snapshot and libs-milestone
- Upgrade to Maven Wrapper 3.9.2
- Release 2.7.14 (2021.2.14)
- Upgrade to Maven Wrapper 3.9.3
- Release 2.7.15 (2021.2.15)
- Upgrade to Maven Wrapper 3.9.4
- Release 2.7.16 (2021.2.16)
- Release 2.7.17 (2021.2.17)
- Schema-validation: missing sequence HOT 1
- Upgrade to Maven Wrapper 3.9.5
- Release 2.7.18 (2021.2.18)
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from spring-data-envers.