I have used PreInsertEventListener
and PreUpdateEventListener
Event Listener to insert created date and updated date in table.
The problem i am fac
I recently get same problem when I integrate Spring4 and Hibernate5. This is my BaseEntity class.
@MappedSuperclass
public class BaseEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(nullable = false, updatable = false)
private Date createDate;
@Column(nullable = false)
private Date modifyDate;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public Date getModifyDate() {
return modifyDate;
}
public void setModifyDate(Date modifyDate) {
this.modifyDate = modifyDate;
}
}
First of all, you need to define EntityListener class.
public class EntityListener implements PreInsertEventListener, PreUpdateEventListener {
private static final String CREATE_DATE_PROPERTY = "createDate";
private static final String MODIFY_DATE_PROPERTY = "modifyDate";
@Override
public boolean onPreInsert(PreInsertEvent event) {
if (event.getEntity() instanceof BaseEntity){
//property name of entity
String[] propertyNames = event.getPersister().getEntityMetamodel().getPropertyNames();
//property value of entity
Object[] state = event.getState();
for (int i = 0; i < propertyNames.length ; i ++) {
if (CREATE_DATE_PROPERTY.equals(propertyNames[i]) || MODIFY_DATE_PROPERTY.equals(propertyNames[i])){
state[i] = new Date();
}
}
}
return false;
}
@Override
public boolean onPreUpdate(PreUpdateEvent event) {
if (event.getEntity() instanceof BaseEntity){
//property name of entity
String[] propertyNames = event.getPersister().getEntityMetamodel().getPropertyNames();
//property value of entity
Object[] state = event.getState();
for (int i = 0; i < propertyNames.length ; i ++) {
if (MODIFY_DATE_PROPERTY.equals(propertyNames[i])){
state[i] = new Date();
}
}
}
return false;
}
}
Then, you should register entity event listener.
@SuppressWarnings("unchecked")
@Component
public class EntityEventListenerRegistry {
@Autowired
private SessionFactory sessionFactory;
/**
* EventListenerRegistry:http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#annotations-jpa-entitylisteners
*/
@PostConstruct
public void registerListeners(){
EventListenerRegistry eventListenerRegistry = ((SessionFactoryImplementor) sessionFactory).getServiceRegistry().getService(EventListenerRegistry.class);
eventListenerRegistry.prependListeners(EventType.PRE_INSERT, EntityListener.class);
eventListenerRegistry.prependListeners(EventType.PRE_UPDATE, EntityListener.class);
}
}
It worked very well, I hope it's helpful for you.
I had created Interceptor extend it with Hibernate EmptyInterceptor.
Override method onSave()
which will be Called when you save an object, the object is not save into database yet and onFlushDirty()
Called when you update an object, the object is not update into database yet.
In this function i have check my method by its name in which i have to set date at the time of created or updated.
Here is sample code of onFlushDirty() method.
public boolean onFlushDirty(Object entity,Serializable id,Object[] currentState,
Object[] previousState,String[] propertyNames, Type[] types)
{
if ( entity instanceof City ) {
for ( int i=0; i < propertyNames.length; i++ ) {
if ( "lastUpdatedOn".equals( propertyNames[i] ) ) {
currentState[i] = new Date();
return true;
}
}
}
return false;
}
Here lastUpdatedOn
is my method name which set updated date of record.
onSave() method :
public boolean onSave(Object entity, Serializable id, Object[] state,
String[] propertyNames, Type[] types)
{
if ( entity instanceof City) {
for ( int i=0; i<propertyNames.length; i++ ) {
if ( "createdOn".equals( propertyNames[i] ) ) {
state[i] = new Date();
return true;
}
}
}
return false;
}
Here createdOn
is method to set created date for record.
Extend your POJO class with this interceptor class.
Do like this
public class PreInsertListener implements PreInsertEventListener,
PreUpdateEventListener
{
@Override
public boolean onPreInsert(PreInsertEvent arg0) {
if(arg0.getEntity() instanceof City){
City city = (City)arg0.getEntity();
city.setCreated_date(new Date());
}
return false;
}
@Override
public boolean onPreUpdate(PreUpdateEvent arg0) {
if(arg0.getEntity() instanceof City){
City city = (City)arg0.getEntity();
city.setCreated_date(new Date());
}
return false;
}
}