@RevisionEntity
moejoe Jul 14, 2009 10:51 AMHi there,
I am having a problem trying to get my tables to include a field called logged in.
Basically i have envers auditing now and i am trying to use a RevisionListener to add more detail to my logging. such as the user that made the modification.
I have added all the fields that are needed such as ID and timestamp but i would like to add an extra on that is logged in(see bottom of code)
I am using the update
propety on my machine and i have the following code below.
package za.co.aforbes.fpc.db.model.user;
import java.util.Collection;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.hibernate.envers.Audited;
import org.hibernate.envers.RevisionEntity;
import org.hibernate.envers.RevisionNumber;
import org.hibernate.envers.RevisionTimestamp;
import za.co.aforbes.fpc.db.model.BaseLookupModel;
import za.co.aforbes.fpc.db.model.ListenerClass;
import za.co.aforbes.fpc.db.model.SelectableModel;
import za.co.aforbes.fpc.db.model.util.UUIDGenerator;
@Entity
@Table(name = "SystemUser")
@RevisionEntity(ListenerClass.class)
public final class User extends BaseLookupModel<String> implements SelectableModel {
/**
* {@link Enum} representation of common accounts.
*
* @author Justin Rundle
*/
public static enum Common {
SystemAccount("00000000-0000-0000-0000-000000000000"), IndividualAdviceCentre(
"00000000-0000-0000-0000-000000000003");
private String primaryId = null;
private Common(String primaryId) {
this.primaryId = primaryId;
}
public String getPrimaryId() {
return primaryId;
}
} // end Common
@Id
@GeneratedValue(generator = "UUIDGenerator")
@GenericGenerator(name = "UUIDGenerator", strategy = UUIDGenerator.STRATEGY)
@Column(name = "SystemUserGUID", updatable = false)
@Audited
private String primaryId;
@Column(name = "ActiveDirectoryGUID")
private String activeDirectoryId;
@Column(name = "FirstName")
@Audited
private String firstName;
@Column(name = "LastName")
@Audited
private String lastName;
@Column(name = "InternalEMailAddress")
@Audited
private String internalEMailAddress;
@Column(name = "DomainName")
@Audited
private String domainName;
@Column(name = "EmployeeNo")
private String employeeNo;
@ManyToOne
@JoinColumn(name = "Designation")
@Audited
private UserDesignation userDesignation;
@ManyToOne
@JoinColumn(name = "Department")
@Audited
private Department department;
@ManyToOne
@JoinColumn(name = "Remunerationtype")
@Audited
private RemunerationType remunerationType;
@Column(name = "Available")
@Audited
private boolean available;
@Column(name = "Enabled")
@Audited
private boolean enabled;
@Column(name = "Revised")
private boolean revised;
@Column(name = "CreatedBy")
private String createdById;
@Column(name = "DateCreated")
private Date dateCreated;
@Column(name = "ModifiedBy")
private String modifiedById;
@Column(name = "DateModified")
private Date dateModified;
@OneToMany(mappedBy = "user")
@Cascade( {org.hibernate.annotations.CascadeType.SAVE_UPDATE,
org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
@LazyCollection(LazyCollectionOption.FALSE)
private Collection<UserRole> userRoles;
@Transient
private boolean selected = false;
/**
* Constructs a new User object.
*/
public User() {}
/*
* (non-Javadoc)
* @see za.co.aforbes.fpc.db.model.SelectableModel#isSelected()
*/
@Override
public final boolean isSelected() {
return selected;
}
/*
* (non-Javadoc)
* @see za.co.aforbes.fpc.db.model.SelectableModel#setSelected(boolean)
*/
@Override
public final void setSelected(boolean selected) {
this.selected = selected;
}
/**
* Returns a {@link Boolean} representation of whether the user is the specific role.
*
* @param role the role to check
* @return true if the user is the specifid role
*/
public final boolean isRole(Role.Type role) {
if(role == null) {
return false;
}
for(UserRole userRole : getUserRoles()) {
if(userRole.getRole().isRole(Role.Type.SystemAdministrator)) {
return true;
} else if(userRole.getRole().isRole(role)) {
return true;
}
}
return false;
}
/**
* Returns true if this user is equal to the specified user.
*
* @param user to compare.
* @return true if this user is equal.
*/
public boolean isUser(Common user) {
return this.getPrimaryId().equalsIgnoreCase(user.getPrimaryId());
}
/*
* (non-Javadoc)
* @see za.co.aforbes.fpc.db.model.BaseModel#getPrimaryId()
*/
@Override
public final String getPrimaryId() {
return primaryId;
}
/*
* (non-Javadoc)
* @see za.co.aforbes.fpc.db.model.BaseModel#setPrimaryId(java.lang.Object)
*/
@Override
public final void setPrimaryId(String primaryId) {
this.primaryId = primaryId;
}
@Override
public String getDescription() {
return getFirstName() + " " + getLastName();
}
@Override
public void setDescription(String description) {
// Do nothing.
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public final String getLastName() {
return lastName;
}
public final void setLastName(String lastName) {
this.lastName = lastName;
}
public String getInternalEMailAddress() {
return internalEMailAddress;
}
public void setInternalEMailAddress(String internalEMailAddress) {
this.internalEMailAddress = internalEMailAddress;
}
public UserDesignation getUserDesignation() {
if(userDesignation == null) {
userDesignation = new UserDesignation();
}
return userDesignation;
}
public void setUserDesignation(UserDesignation userDesignation) {
this.userDesignation = userDesignation;
}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public boolean isAvailable() {
return available;
}
public void setAvailable(boolean available) {
this.available = available;
}
public String getEmployeeNo() {
return employeeNo;
}
public void setEmployeeNo(String employeeNo) {
this.employeeNo = employeeNo;
}
public Department getDepartment() {
if(department == null) {
department = new Department();
}
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
public final Collection<UserRole> getUserRoles() {
return userRoles;
}
public final void setUserRoles(Collection<UserRole> userRoles) {
this.userRoles = userRoles;
}
public RemunerationType getRemunerationType() {
if(remunerationType == null) {
remunerationType = new RemunerationType();
}
return remunerationType;
}
public void setRemunerationType(RemunerationType remunerationType) {
this.remunerationType = remunerationType;
}
public final boolean isRevised() {
return revised;
}
public final void setRevised(boolean revised) {
this.revised = revised;
}
public final String getActiveDirectoryId() {
return activeDirectoryId;
}
public final void setActiveDirectoryId(String activeDirectoryId) {
this.activeDirectoryId = activeDirectoryId;
}
public final String getDomainName() {
return domainName;
}
public final void setDomainName(String domainName) {
this.domainName = domainName;
}
public final String getCreatedById() {
return createdById;
}
public final void setCreatedById(String createdById) {
this.createdById = createdById;
}
public final Date getDateCreated() {
return dateCreated;
}
public final void setDateCreated(Date dateCreated) {
this.dateCreated = dateCreated;
}
public final String getModifiedById() {
return modifiedById;
}
public final void setModifiedById(String modifiedById) {
this.modifiedById = modifiedById;
}
public final Date getDateModified() {
return dateModified;
}
public final void setDateModified(Date dateModified) {
this.dateModified = dateModified;
}
@Id
@GeneratedValue
@RevisionNumber
private int revisionId;
@RevisionTimestamp
private Long timeStamp = 0L;
private String loggedIn;
public int getRevisionId() {
return revisionId;
}
public void setRevisionId(int revisionId) {
this.revisionId = revisionId;
}
public Long getTimeStamp() {
return timeStamp;
}
public void setTimeStamp(Long timeStamp) {
this.timeStamp = timeStamp;
}
public String getLoggedIn() {
return loggedIn;
}
public void setLoggedIn(String loggedIn) {
this.loggedIn = loggedIn;
}
}
here is my application context.xml
<?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:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd "> <!-- START - IFA DATASOURCE AND SESSION FACTORY--> <!-- Below are connection values to the database. These values are used in the hibernate.properties file and are populated at runtime --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="ifaSessionFactory"/> </bean> <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>java:comp/env/jdbc/ifaDB</value> </property> </bean> <bean id="ifaSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="configLocation"> <value>WEB-INF/hibernate/hibernate-ifa.cfg.xml</value> </property> <property name="configurationClass"> <value>org.hibernate.cfg.AnnotationConfiguration</value> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop> <prop key="hibernate.cglib.use_reflection_optimizer">true</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.transaction.auto_close_session">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <!-- </prop>--> <prop key="org.hibernate.envers.auditTableSuffix">Log</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.connection.release_mode">after_statement</prop> <prop key="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</prop> </props> </property> <property name="eventListeners"> <map> <entry key="post-insert"> <list> <ref bean="ejbInsert" /> <ref bean="audit" /> </list> </entry> <entry key="post-update"> <list> <ref bean="ejbUpdate" /> <ref bean="audit" /> </list> </entry> <entry key="post-delete"> <list> <ref bean="ejbDelete" /> <ref bean="audit" /> </list> </entry> <entry key="pre-collection-update"> <ref bean="audit" /> </entry> <entry key="pre-collection-remove"> <ref bean="audit" /> </entry> <entry key="post-collection-recreate"> <ref bean="audit" /> </entry> </map> </property> </bean> <!-- END - IFA DATASOURCE AND SESSION FACTORY--> <bean name="callBack" class="org.hibernate.ejb.event.EntityCallbackHandler" /> <bean name="audit" class="org.hibernate.envers.event.AuditEventListener" /> <bean name="ejbInsert" class="org.hibernate.ejb.event.EJB3PostInsertEventListener"> <property name="callbackHandler"> <ref bean="callBack" /> </property> </bean> <bean name="ejbUpdate" class="org.hibernate.ejb.event.EJB3PostUpdateEventListener"> <property name="callbackHandler"> <ref bean="callBack" /> </property> </bean> <bean name="ejbDelete" class="org.hibernate.ejb.event.EJB3PostDeleteEventListener" > <property name="callbackHandler"> <ref bean="callBack" /> </property> </bean> <bean id="hibernateDao" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true"> <property name="transactionManager" ref="transactionManager" /> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> </beans
I just need the REVINFO table to include my custom field which is the loggedInUser
Thanks,
Muhammed Patel