Sunday, November 21, 2010

Hibernate : Pre Database Opertaion Event Listeners



Hibernate provides two (logical) ways of interfering with the operations performed on entities. It is either through interceptors and/or its the event handling mechanism. Just as a point, as it initially sounds event handling mechanism of hibernate is not asynchronous, rather it is synchronous and same as interceptors. Interceptors are internally used by the default event listeners. Event Listener is a modern and basic infrastructure of hibernate used by the interceptors too.

The differences are not much and most of the common needs could be full filled by either using any one of them or a combination of both interceptors or event listeners. Its not actually quite clear when one should use which mechansim. I would personally suggest to stick with Event Listeners as they are much more flexible and robust. This is a very broad area of discussion and here we focus our discussion only on some specific types of event listeners ( pre database operations ).

Hibernate provides an event handling framework for various kind of methods on the session interface. Whenever an operation is performed through the session, an event is generated and a corresponding listener is evoked to take some action on the generated event. These events could be events on entity, like on load, pre load, pre insert, post insert etc. (Look at the subclasses of AbstractEvent class to get a complete list of all events). These events could be divided into two basic categories, pre database operations and post database operations.

For me pre database operation events were of major interest because I needed a general mechanism to stamp ,update and insert user and time, on all my persistent objects.

All the events are subclasses of org.hibernate.event.AbstractEvent. The parent of all pre database operation events is the class AbstractPreDatabaseOperation. This has three children PreUpdateEvent, PreInsertEvent and PreDeleteEvent. Here after, we will be focusing our discussion on the usage of PreUpdate and PreInsert Events.

Given : The problem was to add insert and update user and timestamp information to all of my entities.

Approach 1 :

____________________________________________________________________


public class MyPreInsertEventListener implements PreInsertEventListener {
     @Override
     public boolean onPreInsert(PreInsertEvent event) {
          Object object = event.getEntity();
          if (object instanceof Auditable) {
               Auditable entity = (Auditable) object;
               if (entity.getInsertUser() == null) {
               String currentUser = UtilityClass.currentUser();
               Date currentTime = new Date();
               // inserts
               entity.setInsertUser(currentUser);
               entity.setInsertDateTime(dayTime);
               }
          }
          return false;
     }
}

public class MyPreUpdateEventListener implements PreInsertEventListener {
     @Override
     public boolean onPreUpdate(PreUpdateEvent event) {
          Object object = event.getEntity();
          if (object instanceof Auditable) {
               Auditable entity = (Auditable) object;
               String currentUser = UtilityClass.currentUser();
               Date currentTime = new Date();
               // updates
               entity.setUpdateUser(currentUser);
               entity.setUpdateDateTime(currentTime);
          }
          return false;
     }
}

____________________________________________________________________

Now when the entity object inside the event is updated in the pre listener, the expectation is that the updated information is persisted in the database too. But this does not happen and for a given entity you would see these fields being null (or unchanged) on the database. So where is the problem ?

The idea of the pre database operation event listeners was probably not to change the entities itself, but to perform some operations around the state of the entitiy, just prior to its insert or update into the database. For e.g. you could get the name of the class of an entity and decide whether the given user could update this entity or not and you could throw an exception on an illegal access. The idea is to save the state of the entity at the time of the commit and not take into account any of the changes made to this entity object after the commit (for e.g. here we set insert and update information of entities in our listeners).

These pre events contain variety of information around the entity. The ones in which we are interested are listed below.

1. The pre events have a object array called 'state'. These are values of all the attributes of a given entity at the time of calling commit.
2. The entity object itself.
3. The entity persister used by the hibernate to perform operations on the given entity.
4. The event source (which is the assosiated session in the current context).

At this stage, the entity object assosiated with the event could be thought of as a detached object. Any changes made to this object will never be reflected on the database. The state that will finally be reflected in the database after the commit is contained in the 'state' object array.

In order to commit any changes to the entity object, you could get hold of the session object and use it to save changes to the database. This could be done as follows :

Approach 2.
____________________________________________________________________


public class MyPreUpdateEventListener implements PreInsertEventListener {
     @Override
     public boolean onPreUpdate(PreUpdateEvent event) {
          Object object = event.getEntity();
          if (object instanceof Auditable) {
               Auditable entity = (Auditable) object;
               String currentUser = UtilityClass.currentUser();
               Date currentTime = new Date();
               // updates
               entity.setUpdateUser(currentUser);
               entity.setUpdateDateTime(currentTime);
               Transaction txn = event.getSession().beginTransaction();
               event.getSession().save(entity);
               txn.commit();

          }
          return false;
     }
}

____________________________________________________________________

I read this solution in some thread on hibernate forum. This approach may work in many cases but it may fail in equal number of cases (or more). This could also result into recursive calls to this onPreUpdate method and thus resulting into stackoverflow exception. I won't be discussing this issue over here. This would be a working but not a clean and standard solution. Personally I would not recommend this approach until I know all possible side effects the different possible scenarios could cause.

In order to make changes to entities, the right approach would be to make changes to the object array 'state' present in the associated event. The 'state' is an object array containing values of attributes of an entitiy and hence it would be difficult to know and replace the correct value. But fortunately these values are in a particular order and this order does not change.

The entity persister has an entitymodel which contains a lot of information about the entity. For e.g. it contains an array called propertyNames. This array has the propertyNames in the same order as the values of the properties present in the 'state' array in event. Hence our modified code would look like :

Approach 3.
____________________________________________________________________


public class MyPreInsertEventListener implements PreInsertEventListener {
     @Override
     public boolean onPreInsert(PreInsertEvent event) {
          Object object = event.getEntity();
          if (object instanceof Auditable) {
               Auditable entity = (Auditable) object;
               if (entity.getInsertUser() == null) {
                    String currentUser = UtilityClass.currentUser();
                    Date currentTime = new Date();
                    String[] propertyNames = event.getPersister().getEntityMetamodel.getPropertyNames();
                    Object[] state = event.getState();

                    // inserts
                    setValue(state, propertyNames, "insertUser", currentUser, entity);
                    setValue(state, propertyNames, "insertTime", currentTime, entity);
               }
          }
          return false;
     }
}

public class MyPreUpdateEventListener implements PreInsertEventListener {
     @Override
     public boolean onPreUpdate(PreUpdateEvent event) {
          Object object = event.getEntity();
          if (object instanceof Auditable) {
               Auditable entity = (Auditable) object;
               String currentUser = UtilityClass.currentUser();
               Date currentTime = new Date();
               String[] propertyNames = event.getPersister().getEntityMetamodel().getPropertyNames();
               Object[] state = event.getState();

               // updates
               setValue(state, propertyNames, "updateUser", currentUser, entity);
               setValue(state, propertyNames, "updateTime", currentTime, entity);
          }
     return false;
     }
}

A common method in both the classes.

void setValue(Object[] currentState, String[] propertyNames, String propertyToSet, Object value, Object entity) {
     int index = ArrayUtils.indexOf(propertyNames, propertyToSet);
     if (index >= 0) {
          currentState[index] = value;
          } else {
               Log.error("Field '" + propertyToSet + "' not found on entity '" + entity.getClass().getName() + "'.");
          }
}

____________________________________________________________________

This solution will work in most of the cases, however there is still one case which is left out and will fail. Here is the trick described below :

Hibernate generates a prepared statement and fills in the parameters from the 'state' array present in the event. Hence any changes made to the this 'state' array are reflected in the sql statement generated by the hibernate and finally on the database. The insert and update events have a different copy of this states array.

The pre insert listener is called before the pre update event (if an insert as well as update happens). This happens when an entity is created, persisted and then modified in the same transaction. This will result into two seperate sql statements, first will be an insert statement and second one will be an update statement, on the same entitiy. With the insert statement as we set only the insertUser and insertTime in our PreInsertEventListener and not updateUser and updateTime. The generated statement will look like

insert into entity (id, .... , insert_user, insert_time, update_user, update_time) values (1, .... 'test', '21.11.2010 16:10:00', null, null)

with the PreUpdateEventListener the update sql generated will be like

update entity set id=1 .... , insert_user=null, insert_time=null, update_user='test', update_time='21.11.2010 16:10:00'

These two sqls will be generated in the same transaction and one after the other. The effect will be that the update sql will override the values in the insert sql and hence insert user and time will always be null in such cases. In order to avoid this, I modified the code as follows :

Approach 4.
____________________________________________________________________


public class MyPreInsertEventListener implements PreInsertEventListener {
     @Override
     public boolean onPreInsert(PreInsertEvent event) {
          Object object = event.getEntity();
          if (object instanceof Auditable) {
               Auditable entity = (Auditable) object;
               if (entity.getInsertUser() == null) {
                    String currentUser = UtilityClass.currentUser();
                    Date currentTime = new Date();
                    String[] propertyNames = event.getPersister().getEntityMetamodel().getPropertyNames();
                    Object[] state = event.getState();
                    // inserts
                    entity.setInsertUser(currentUser);
                    entity.setInsertDateTime(dayTime);
                    setValue(state, propertyNames, "insertUser", currentUser, entity);
                    setValue(state, propertyNames, "insertTime", currentTime, entity);
               }
          }
          return false;
     }
}

public class MyPreUpdateEventListener implements PreInsertEventListener {
     @Override
     public boolean onPreUpdate(PreUpdateEvent event) {
          Object object = event.getEntity();
          if (object instanceof Auditable) {
               Auditable entity = (Auditable) object;
               String currentUser = UtilityClass.currentUser();
               Date currentTime = new Date();
               String[] propertyNames = event.getPersister().getEntityMetamodel().getPropertyNames();
               Object[] state = event.getState();
               // inserts
               setValue(state, propertyNames, "insertUser", entity.getInsertUser(), entity);
               setValue(state, propertyNames, "insertTime", entity.getInsertDateTime(), entity);

               // updates
               entity.setUpdateUser(currentUser);
               entity.setUpdateDateTime(currentTime);
               setValue(state, propertyNames, "updateUser", currentUser, entity);
               setValue(state, propertyNames, "updateTime", currentTime, entity);
          }
          return false;
     }
}

____________________________________________________________________

The entity object is common and shared between the two events (insert and update). However, each event has its own copy of 'state' array. Here I use this fact in my favour to pass in the insert information between the two event listeners through the entity object itself. Hence in the update event listener I do reset the insert information passed in from the insert event listeners and hence the generated sqls from the two listeners would look like :

insert into entity (id, .... , insert_user, insert_time, update_user, update_time) values (1, .... 'test', '21.11.2010 16:10:00', null, null)

update entity set id=1 .... , insert_user=test, insert_time='21.11.2010 16:10:00', update_user='test', update_time='21.11.2010 16:10:00'

This solution works fine and I have'nt seen yet, any problem or case which could not have been handled. However I would like to conclude by saying not to use Event listeners for any custom auditing. Envers comes bundled up with Hibernate 3.5.6 and beyond. Envers is an excellent framework for auditing and I have been using it successfully.

134 comments:

Val said...

Wonderful article - very helpful. I have a further problem in attempting to update *other* objects, eg, an order (onPreUpdate) reads/updates the related customer. The parent/customer is not being saved. Manual flushing leads to other problems. Very interested in suggestions.

anshuiitk said...

Do you really need to update customer on pre update event for order ?. Best would be to rely on post data base operation events, in such cases.

However if that is a requirement, then the Approach 2 (although not recommended) might work for you. Did you try it ?.

Unknown said...

Hi
Nice article.I have issue with the pre-insert & pre-update event in my application.Actually in my application I need to update all the rows of table before inserting or updating any row.I tried adding both the event listener but I am getting following error:

"java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction"

Any help is really appreciated

Naveen said...

is there any other way to get the entityMetaModel because the hibernate jar i use doesn't come with getEntityMetaModel

anshuiitk said...

@Cuumins12 : Well if it is saying a timeout, it could be a big transaction. Try breaking it up into smaller chunks. I am not really sure how you are trying to use the Listeners, but I guess it would be a good idea, if you could send some code snippets (a sampel to reproduce) and then we can post the solution here.

anshuiitk said...

@Naveen : Which version of hibernate are you using. Also getEntityMetaModel() method is present in AbstractEntityPersister and hence the subclasses JoinedSubclassEntityPersister, SingleTableEntityPersister and UnionSubclassEntityPersister. Please let me know If you are experiencing somthing different.

neildo said...

You're making this too complicated. Just create an event listener for the SaveOrUpdateEvent. Any changes you make to the object will get saved. An example can be found here:

http://notatube.blogspot.com/2010/03/hibernate-using-event-listener-to-set.html

anshuiitk said...

@Neildo : Was good to read your article, but as said, there are number of scenarios in an application. What you said would work in case of a save or update, but what if you did a persist ? and what if you wanted to differentiate between an update and an insert.

As said in the article there are number way arounds but the best method should be chosen only after carefully analyses of your problem.

Unknown said...

event.getPersister().getEntityMetamodel().getPropertyNames() doesnt return primary keys, I would like set max(id) using PreInsertEventListener, Can you please help me.

Unknown said...

Hi anshuiitk,

Very good posting, Please give me some idea on how to implement a PreLoadEventListener. I have gone through several blogs so far and i didn't find any posting on PreLoadEventListener. I need to implement a listener comes into action right before firing query for the data i.e preLoad() kind of. So that i can do the filling of the collection with data from another API of my choice. Please help me on this, i have been looking for a solution from a quite a long time.

ViRuS said...

Hello, do you have any idea about this
https://forum.hibernate.org/viewtopic.php?f=1&t=1025393
?

Unknown said...

How can I obtain the sql statement generated in a PreUpdateEventListener or PostUpdateEventListener?

I need the sql to save it in an audit table.

thanks.

Unknown said...

How can I obtain the sql statement generated in a PreUpdateEventListener or PostUpdateEventListener?

I need the sql to save it in an audit table.

thanks.

Unknown said...

Nice article ! I'm doing the same kind of work here but I was wondering how to acces to my http context in the preUpdate listener. I need to stamp some information stored in the httpSession (equivalent to your Utils.currentUser()). Do you have an idea on how I could do that?

Unknown said...
This comment has been removed by the author.
Unknown said...

Excellent Article

Alwin Co Daan said...

Amazing & Great informative blog,it gives very useful practical information to developer like me. Besides that Wisen has established as Best Java Online Training India . or learn thru Online Training mode Java Online Training From India . Nowadays Hibernate ORM has tons of job opportunities on various vertical industry.

Unknown said...

Usually I never comment on blogs but your article is so convincing that I never stop myself to say something about it. You’re doing a great job Man, Keep it up.
Hibernate Training in Noida

Unknown said...

Very interesting subject, and nice article. However I would like to make a remark if I may:

- It is not that you take profit of the object being shared between update and insert events. This is true, but I don't think it is the most general scenario. The big one is that you make changes in the database that should be take into consideration in the object model to reflect the changes in the database. That is why the 3rd solution was wrong. I think you are fitting to a particular case and not explaining the background problem. When you state:

"with the PreUpdateEventListener the update sql generated will be like

update entity set id=1 .... , insert_user=null, insert_time=null, update_user='test', update_time='21.11.2010 16:10:00'" you don't really tell us why, so I had to take time to figure out. The changes in the insert sql sentence doesn't change the java object, so a null is used for the update. I wasn't easy to find out, at first glance I didn't understand why those columns were being persisted despite not having been changed, and tryed to imagine how Hibernate could do things better. Anyway, it was fun for me to realize. Great article.

Anonymous said...


Codeigniter training in Noida

Tech Future is one of the leading WordPress training institutes in Noida.
After completing WordPress training from our institute, students will be
able to exhibit strong foundation knowledge of WordPress CMS. On
completion of wordpress training classes, students can expect a good
career development in WordPress content management system.

Web desining said...


Here is STUCORNER the Best IT training institute in Laxmi Nagar you can visit their site:
Best Training institute for IT training
Best .net Training institute
Best Foreign Language Training institute
Best Cloud Computing Training institute
Best SQT Training institute
Best CandC++ Training institute
Best Autocad Training institute
Best Digital Marketing Training institute
Best hadoop Training institute
Best CSP Training institute

pooja said...

Awesome..You have clearly explained …Its very useful for me to know about new things..Keep on blogging..
Devops Training courses
python Training in chennai
Devops Training in Bangalore

jvimala said...

You are doing a great job. I would like to appreciate your work for good accuracy
Regards,
Best Devops Training in Chennai | Best Devops Training Institute in Chennai

tamilsasi said...

After reading this web site I am very satisfied simply because this site is providing comprehensive knowledge for you to audience.
Thank you to the perform as well as discuss anything incredibly important in my opinion. We loose time waiting for your next article writing in addition to I beg one to get back to pay a visit to our website in



selenium training in Bangalore
selenium training in Marathahalli
selenium training in Btm layout
selenium training in Jaya nagar
selenium training in Electronic city
selenium training in Kalyan nagar



gowsalya said...

Thank you for sharing such great information with us. I really appreciate everything that you’ve done here and am glad to know that you really care about the world that we live in
Python Online training
python Course institute in Chennai
Python Course institute in Bangalore

karthick said...

This is really impressive post, I am inspired with your post, do post more blogs like this, I am waiting for your blogs.


Machine Learning in Chennai

viji said...

This is best one article so far I have read online, I would like to appreciate you for making it very simple and easy
Regards,
Devops Training in Chennai | Devops Certification in Chennai

service care said...

This is the exact information I am been searching for, Thanks for sharing the required infos with the clear update and required points.
honor service centre chennai

anusha said...



MEAN Stack Training in Chennai MEAN Stack Training in Chennai with real time projects. We are Best MEAN Stack Training Institute in Chennai. Our Mean Stack courses are taught by Industrial Experts which would help you to learn MEAN Stack development from the scratch.

Anonymous said...

Thanks for sharing this information and keep updating us.Content is informative and effective. Really it was an awesome article.

Salesforce training in Noida | Salesforce Consulting Partners | Salesforce Implementation Partner

Surbhi Jaiswal said...

If you want to join Best Digital Marketing Institute in Delhi and if you want to know about the directions , you may click on the link to reach the institute.
Digital Edge directions

unknow said...

I really enjoyed your blog Thanks for sharing such an informative post.
Best Website Development service In Noida

Web Designer in Noida
Best Website Development service In Noida
Website Designing service In Noida
Best digital marketing service In Noida
Best digital marketing Company in Noida
Best SEO service In Noida
Best SEO Company in Noida
Software development Company in Noida
Web hosting Company in Noida
Best bulk emails Company in Noida
Best content writing Company in Noida
Best bulk sms Company in Noida
Bulk sms Company in Noida
Bulk sms service In Noida

deepika said...

very informative article. very helpful to garther the information

Python training in banglore

Tech Guy said...

Best place to learn Python in bangalore.
python training in bangalore

Tech Guy said...

AWS Training in bangalore!!
visit:
AWS Training in bangalore

Tech News said...

nice blog
iot training in bangalore

shivam said...

Flying Shift - Packers & Movers in Bhopal

Tech Guy said...

Nice article
For Blockchain training in Bangalore, visit:
Blockchain training in Bangalore

Tech News said...

nice blog
devops training in bangalore
hadoop training in bangalore
iot training in bangalore
machine learning training in bangalore
uipath training in bangalore

Tech News said...

Devops training in bangalore

Ramakrishna said...

very nice blog...I will definitely follow your blog in future
Meanstack Training in Hyderabad
Meanstack Online Training
Meanstack Training in Hyderabad
Meanstack Training in Ameerpet
Best Meanstack Training in Hyderabad

Tech News said...

Visit Here ==> Big Data And Hadloop Training in Bangalore

Tech Guy said...

For Data Science training in bangalore, Visit:
Data Science training in bangalore

Tech Guy said...

For Python training in Bangalore, Visit:
Python training in Bangalore

Tech Guy said...

For AWS training in Bangalore, Visit:
AWS training in Bangalore

Tech Guy said...

For Blockchain training in Bangalore, Visit:
Blockchain training in Bangalore

Tech Guy said...

Nice Blog.
For AI training in Bangalore, Visit:
Artificial Intelligence training in Bangalore

Tech Guy said...

Nice Blog
For Data Science training in Bangalore, Visit:
Data Science training in Bangalore

Anonymous said...

Nice Post
For Python training in Bangalore, Visit:
Python training in Bangalore

Tech Guy said...

For Data Science training in Bangalore, Visit:
Data Science training in Bangalore

Tech Guy said...

For AWS training in Bangalore, Visit:
AWS training in Bangalore

Anonymous said...

Visit here for more info : Hadoop Training in Bangalore

verdure skills india pvt ltd said...

nice blog
get best placement at VSIPL

get digital marketing services
seo network point

Anonymous said...

Visit for Data Science training in Bangalore :
Data Science training in Bangalore

Anonymous said...

For Python training in Bangalore, Visit:
Python training in Bangalore

Anonymous said...

For IOT Training in Bangalore Visit:
IOT Training in Bangalore

Anonymous said...

Nice Post
For Data Science training in Bangalore, Visit:
Data Science training in Bangalore

Customer relationship management said...

It is very good and useful for students and developer .Learned a lot of new things from your post!Good creation ,thanks for give a good information at Devops.devops training in bangalore

Customer relationship management said...

Thanks for sharing it with us. I am very glad that I spent my valuable time in reading this post.devops Training in Bangalore

Customer relationship management said...

I know that it takes a lot of effort and hard work to write such an informative content like this.Amazon web services Training in Bangalore

Durai Moorthy said...

Wonderful post. Thanks for taking time to share this information with us.
aws Training in Bangalore
python Training in Bangalore
hadoop Training in Bangalore
angular js Training in Bangalore
bigdata analytics Training in Bangalore

vijay said...

Thanks for this informative blog
aws Training in Bangalore
python Training in Bangalore
hadoop Training in Bangalore
angular js Training in Bangalore
bigdata analytics Training in Bangalore

Aryan Garg said...

Really you blog have very interesting and very valuable information. thanks for sharing

digital marketing courses in Delhi
Digital Marketing Institute in Delhi
PPC course institute in Noida
English Speaking Course in Noida.
Computer institute in Noida

Durai Moorthy said...

Thanks for sharing an informative blog keep rocking bring more details
aws Training in Bangalore
python Training in Bangalore
hadoop Training in Bangalore
angular js Training in Bangalore
bigdata analytics Training in Bangalore
python Training in Bangalore
aws Training in Bangalore

Rajesh Anbu said...

Wonderful blog with lots of information, Keep up the good work and share more like this.
aws Training in Bangalore
python Training in Bangalore
hadoop Training in Bangalore
angular js Training in Bangalore
bigdata analytics Training in Bangalore
python Training in Bangalore
aws Training in Bangalore

Kerrthika K said...

Extraordinary content...! It is very good and always following your blog keep updating here...
Tableau Training in Chennai
Tableau Course in Chennai
Pega Training in Chennai
Spark Training in Chennai
Oracle DBA Training in Chennai
JMeter Training in Chennai
Graphic Design Courses in Chennai
Power BI Training in Chennai
Linux Training in Chennai
Oracle Training in Chennai
Unix Training in Chennai

Priyanka said...

Attend The Machine Learning course Bangalore From ExcelR. Practical Machine Learning course Bangalore Sessions With Assured Placement Support From Experienced Faculty. ExcelR Offers The Machine Learning course Bangalore.
ExcelR Machine Learning course Bangalore

Sharon said...

Great blog! I really love how it is easy on my eyes and the information are well written

Sublimation printing in south Delhi
Shimla Today live updates
Top Digital Marketing Agency Delhi

shreekavi said...

Really awesome blog. Your blog is really useful for me. Thanks for sharing this informative blog.
Software Testing Training in Chennai
Software Testing Training in Bangalore
Software Testing Course in Coimbatore
Software Testing Training in Madurai
Software Testing Training Institute in Bangalore
Software Testing Course in Bangalore
Testing Course in Bangalore
Ethical hacking course in bangalore

chandhran said...

Nice informative blog, it shares more intresting information. This blog is useful to me.
PHP Training in Bangalore
PHP Course in Bangalore
PHP Training Institute in Bangalore
PHP Classes in Bangalore
Best PHP Training Institute in Bangalore
PHP Training Institute in Chennai
php training institute in coimbatore
Best php training institute in chennai
Spoken English Classes in Bangalore
ielts coaching in bangalore

Niyaz said...

Your article is worth reading! You are providing a lot of valid information.This'll be really helpful for my reference. Do share more such articles.
AWS Training center in Chennai
AWS Classes in Chennai
AWS training fees in Chennai
R Training in Chennai
Data Science Training in Chennai
AWS Training in Anna nagar
AWS Training in OMR
AWS Training in Porur

Unknown said...

python course in coimbatore
python training in coimbatore
java course in coimbatore
java training in coimbatore
android course in coimbatore
android training in coimbatore
php course in coimbatore
php training in coimbatore
digital marketing course in coimbatore
digital marketing training in coimbatore
software testing course in coimbatore
software testing training in coimbatore

Unknown said...


python course in coimbatore
java course in coimbatore
python training in coimbatore
java training in coimbatore
php course in coimbatore
php training in coimbatore
android course in coimbatore
android training in coimbatore
datascience course in coimbatore
datascience training in coimbatore
ethical hacking course in coimbatore
ethical hacking training in coimbatore
artificial intelligence course in coimbatore
artificial intelligence training in coimbatore
digital marketing course in coimbatore
digital marketing training in coimbatore
embedded system course in coimbatore
embedded system training in coimbatore

kimi jhaveri said...

Hi, your article was of great help. I loved the way you shared the information, thanks.
Amazing article, I highly appreciate your efforts, it was highly helpful. Thank you CEH Training ,CEH Certification, CEH Online Course, Ethicalhacking

sachin nagar said...

Hi, This is a great article. Loved your efforts on it buddy. Thanks for sharing this with us.
Get cissp
it training courses.
CISSP training ,cissp exam cost, CISSP certification. .Get VMware, vmware training, vmware course, vmware online training., vmware interview questions and answers, vmware Certification, AWS, aws training, aws course, aws certification training, aws online training
Get PMP pmp certification, pmp training, pmp certification in gurgaon,pmp certification cost, pmp training certification

sachin nagar said...

Hi this is the nice blog, thanks for sharing us
Get Azure, azure training,azure certification,microsoft azure training,azure course,azure online training

sachin nagar said...

Hi, This is your awesome article , I appreciate your effort, thanks for sharing us.
cism training
cism certification

cisa training,
cisa certification
cisa exam

Ab Kashyap said...
This comment has been removed by the author.
Priyanka said...

Attend The Artificial Intelligence course From ExcelR. Practical Artificial Intelligence course Sessions With Assured Placement Support From Experienced Faculty. ExcelR Offers The Artificial Intelligence course.
Artificial Intelligence Course

Keerthana said...

The Blogs are attracted to Read more Articles,people are getting Benefit from these kind of post contents, Thanks for sharing us.
For learn more...
python training in chennai | python training in annanagar | python training in omr | python training in porur | python training in tambaram | python training in velachery

Nisar Ahamad said...

IFTDM is the best film training and digital marketing institute in noida. We teach video editing, film shooting, and advance digital marketing courses As SEO, PPC, SMM, Email marketing......

Anonymous said...

Insightful article, for further deeper understanding read
bbs.wwtx
stardima
Top websites to hire web designing experts

CloudLearn ERP said...

Thanks for an interesting blog. What else may I get that sort of info written in such a perfect approach? I have an undertaking that I am just now operating on, and I have been on the lookout for such info.
Best Data Science training in Mumbai

Data Science training in Mumbai

Nisar Ahamad said...

You Can grow your Carrier After complete a digital marketing course in Noida.

Anu said...

Thanks for your informative article, Your post helped me to understand the future and career prospects & Keep on updating your blog with such awesome article.
DevOps Training | Certification in Chennai | DevOps Training | Certification in anna nagar | DevOps Training | Certification in omr | DevOps Training | Certification in porur | DevOps Training | Certification in tambaram | DevOps Training | Certification in velachery

Gorish dua said...

Such an incredible blog post. Thanks a lot.
Wedding planner in Goa
Wedding planner in Delhi
Wedding planner in Mumbai
Wedding planner in Gurgaon

Academy Of Engineers said...

Hello,

Great Post. It's very Useful Information. In Future, Hope To See More Post. Thanks You For Sharing.

Math Online Tuition In Noida
Electronic Engineering online Tuition
BTech Back Paper Online Tuition
12th Mathematics Tuition In Noida
12th Physics Tuition In Noida
10th Mathematics Tuition In Noida
B.Tech Subjects Tuition In Noida For AKTU University
B.Tech AKTU University Coaching Tuition In Noida
Academy Of Engineers Noida BTech Coaching Institute In Delhi

Lopa said...

Appreciating the persistence you put into your blog and detailed information you provide

Artificial Intelligence Training
Java Training
AWS Training
Machine Learning Training
Data Science Training
DevOps Training

bairav said...

Good Post! Thank you so much for sharing this pretty post, it was so good to read and useful to improve my knowledge as updated one, keep blogging.

German Classes in Chennai | Certification | Language Learning Online Courses | GRE Coaching Classes in Chennai | Certification | Language Learning Online Courses | TOEFL Coaching in Chennai | Certification | Language Learning Online Courses | Spoken English Classes in Chennai | Certification | Communication Skills Training

harshni said...

I just got to this amazing site not long ago. I was actually captured with the piece of resources you have got here. Big thumbs up for making such wonderful blog page!
Artificial Intelligence Training in Chennai

Ai Training in Chennai

Artificial Intelligence training in Bangalore

Ai Training in Bangalore

Artificial Intelligence Training in Hyderabad | Certification | ai training in hyderabad

Artificial Intelligence Online Training

Ai Online Training

Blue Prism Training in Chennai

surya said...

Thanks for your post. This is excellent information. The list of your blogs is very helpful for those who want to learn, It is amazing!!! You have been helping many application.
angular js training in chennai

angular training in chennai

angular js online training in chennai

angular js training in bangalore

angular js training in hyderabad

angular js training in coimbatore

angular js training

angular js online training

sathya said...

Amazing web journal I visit this blog it's extremely marvelous. Interestingly, in this blog content composed plainly and reasonable. The substance of data is educational

selenium training in chennai

selenium training in chennai

selenium online training in chennai

selenium training in bangalore

selenium training in hyderabad

selenium training in coimbatore

selenium online training


YOGESH GAUR said...

Yogesh Gaur is the famous digital marketing consultant based in New Delhi. I usually gives digital marketing techniques in order to rank higher in search engines.I write blogs on social media marketing,email marketing,search engine optimization,content marketing and much more.I usually give tips and tricks to money online.To know more visit at:

Post Free ads no registration required
Forum posting sites 2018
Ppt site
Free ppt submission site list
Business listing sites uk

lavanya said...

Very interesting to read this article.I would like to thank you for the efforts you had made for writing this awesome article. This article inspried me to read more. keep it up.Amazing web journal I visit this blog it's extremely marvelous. Interestingly, in this blog content composed plainly and reasonable. The substance of data is educational
Java training in Chennai

Java Online training in Chennai

Java Course in Chennai

Best JAVA Training Institutes in Chennai

Java training in Bangalore

Java training in Hyderabad

Java Training in Coimbatore

Java Training

Java Online Training

Aaditri Technology said...

Aaditri Technology is a leading website design, web development company in Delhi, India we offer custom website development and all types of digital marketing services.

Website Maintainance Company in Delhi
Travel Website Design Company
Best Seo Company in Delhi

Dinkcart said...
This comment has been removed by the author.
Shweta Singh said...

Happy To See Your blog. Thanks For Sharing Such A Informative Post On This Portal. Skill Based Learning is important. Want To See More Post Like This.
Thanks

Online Math Tutor In Noida
Online Math Tutor In Noida
Online Math Tutor In Noida
Applied Math Tuition Noida
BTech Math Tutor In Noida
Engineering Subjects Tuition In Noida
12th Physics Tuition In Noida

Shweta Singh said...

Happy To See Your blog. Thanks For Sharing Such A Informative Post On This Portal. Skill Based Learning is important. Want To See More Post Like This.
Thanks

Online Math Tutor In Noida
Online Math Tutor In Noida
Online Math Tutor In Noida
Applied Math Tuition Noida
BTech Math Tutor In Noida
Engineering Subjects Tuition In Noida
12th Physics Tuition In Noida

anand said...

nice post
Software Testing Training in Chennai | Certification | Online
Courses



Software Testing Training in Chennai

Software Testing Online Training in Chennai

Software Testing Courses in Chennai

Software Testing Training in Bangalore

Software Testing Training in Hyderabad

Software Testing Training in Coimbatore

Software Testing Training

Software Testing Online Training

Ankita Sharma said...
This comment has been removed by the author.
ramesh said...

Thanks for Sharing This Article.It is very so much valuable content."Nice blog I really appreciate your words,Nice post. It is really amazing and helpful.

Azure Training in Chennai

Azure Training in Bangalore

Azure Training in Hyderabad

Azure Training in Pune

Azure Training | microsoft azure certification | Azure Online Training Course

Azure Online Training

ANSON SPORTS said...

Buy online treadmill in india

Home gym packages in india

fitness equipment stores in india

Online sports and fitness shop in india

Gym equipments for home manufacturers and suppliers in india

Devi said...

Great post and informative blog.it was awesome to read, thanks for sharing this great content to my vision. oracle training in chennai

aravind said...

Thanks for sharing this wonderful content.its very useful to us.This is incredible,I feel really happy to have seen your webpage I gained many unknown information, the way you have clearly explained is really fantastic.keep posting such useful information.
DevOps Training in Chennai

DevOps Online Training in Chennai

DevOps Training in Bangalore

DevOps Training in Hyderabad

DevOps Training in Coimbatore

DevOps Training

DevOps Online Training

Aaditri Technology said...

Aaditri Technology is a leading website design, web development company in Delhi, India we offer custom website development and all types of digital marketing services.
Best Web Designing Company in Delhi
Logo Designers in Delhi
Best cms development code in india

Dinkcart said...

Dinkcart is famous and reputed company in Delhi/NCR for manufacturing of printed t-shirts. Get customized t shirts for various purpose and occasions.

T shirt manufacturer in Delhi
Mom –Son Tees Online

Ankita Sharma said...

Girlsncurls is an online shop where you can shopping for Clothing & Accessories from a great selection of Lingerie, Nightwear, Loungewear and more at everyday low prices.


Women's Cotton Bra Online
Womens Panty Hipster Online
Online Shopping for Clothing & Accessories

dhinesh said...

Excellent Blog! I would Thanks for sharing this wonderful content.its very useful to us.I gained many unknown information, the way you have clearly explained is really fantastic.keep posting such useful information.
Full Stack Training in Chennai | Certification | Online Training Course
Full Stack Training in Bangalore | Certification | Online Training Course

Full Stack Training in Hyderabad | Certification | Online Training Course
Full Stack Developer Training in Chennai | Mean Stack Developer Training in Chennai
Full Stack Training

Full Stack Online Training


Rashika said...

One of the best blogs that i have read still now. Thanks for your contribution in sharing such a useful information. Waiting for your further updates.

Digital Marketing Training in Chennai

Digital Marketing Course in Chennai

SEO Training in Chennai

Digital Marketing Training in Bangalore

Digital Marketing Training in Hyderabad

Digital Marketing Training in Coimbatore

Digital Marketing Training

Digital Marketing Course

Digital Marketing Online Training

devi said...

I recently came across your article and have been reading along. I want to express my admiration of your writing skill and ability to make readers read from the beginning to the end. I would like to read newer posts and to share my thoughts with you.
Data Science Training In Chennai

Data Science Online Training In Chennai

Data Science Training In Bangalore

Data Science Training In Hyderabad

Data Science Training In Coimbatore

Data Science Training

Data Science Online Training

swaroop said...

Every day I always visit sites to obtain the best information for materials research I was doing.......

Web Designing Training in Chennai

Web Designing Course in Chennai

Web Designing Training in Bangalore

Web Designing Course in Bangalore

Web Designing Training in Hyderabad

Web Designing Course in Hyderabad

Web Designing Training in Coimbatore

Web Designing Training

Web Designing Online Training

Revathi said...

I feel really happy to have seen your webpage.I am feeling grateful to read this.you gave a nice information for us.please updating more stuff content...keep up!!

Android Training in Chennai

Android Online Training in Chennai

Android Training in Bangalore

Android Training in Hyderabad

Android Training in Coimbatore

Android Training

Android Online Training

prabhu said...

Amazing web journal I visit this blog it's extremely marvelous. Interestingly, in this blog content composed plainly and reasonable. The substance of data is educational.
IELTS Coaching in chennai

German Classes in Chennai

GRE Coaching Classes in Chennai

TOEFL Coaching in Chennai

spoken english classes in chennai | Communication training


sathishkumar said...
This comment has been removed by the author.
vivekvedha said...

Thank you for sharing such great information with us. I really appreciate everything that you’ve done here and am glad to know that you really care about the world that we live in.
acte reviews

acte velachery reviews

acte tambaram reviews

acte anna nagar reviews

acte porur reviews

acte omr reviews

acte chennai reviews

acte student reviews

radhika said...

Thank you for sharing such great information with us. I really appreciate everything that you’ve done here and am glad to know that you really care about the world that we live in


AWS Course in Chennai

AWS Course in Bangalore

AWS Course in Hyderabad

AWS Course in Coimbatore

AWS Course

AWS Certification Course

AWS Certification Training

AWS Online Training

AWS Training

sathishkumar said...
This comment has been removed by the author.
sathishkumar said...

hadoop training in bangalore | hadoop online training
iot training in bangalore | iot online training
devops training in banaglore | devops online training

Smart_Mayo said...

This blog is very helpful information thank you so much for sharing this.
Php projects with source code
Online examination system in php
Student management system in php
Php projects for students
Free source code for academic
Academic projects provider in nashik
Academic project free download

sathishkumar said...
This comment has been removed by the author.
sathishkumar said...

python training in bangalore | python online Training
artificial intelligence training in bangalore | artificial intelligence online training
machine learning training in bangalore | machine learning online training
uipath-training-in-bangalore | uipath online training
blockchain training in bangalore | blockchain online training
aws training in Bangalore | aws online training
data science training in bangalore | data science online training

Unknown said...

nice post..thanks for sharing..
Python Coaching Classes near me | Python Tutorial in coimbatore | python Training Institute in coimbatore| Best Python Training Centre | Online python Training Institute in coimbatore | Python Course with placement in coimbatore | Python Course training in coimbatore | Python training in saravanampatti

Unknown said...

Thanks for sharing this information. I really like your post very much.
Selenium Course in Coimbatore | Selenium Training Course in Coimbatore | Best Selenium Training in Coimbatore | Selenium Training Institute in Coimbatore | Online Selenium Course Training in Coimbatore | Selenium Training in Saravanampatti | Selenium Testing Training Course in Coimbatore

Unknown said...

I went over this website and I believe you have a lot of wonderful information
Android Training Institute in Coimbatore Best Android Training Institutes in Coimbatore | Android Training Course in Coimbatore | Mobile App Training Institute in Coimbatore | Android Training Institutes in Saravanampatti | Online Android Training Institutes in Coimbatore | Mobile Development Training Institute in Coimbatore

sathishkumar said...

hadoop training in bangalore | hadoop online training
iot training in bangalore | iot online training
devops training in banaglore | devops online training

Neeta Borse said...

I really thank you for the valuable info on this great subject and look forward to more great posts. Thanks a lot for enjoying this beauty article with me. I am appreciating it very much! Looking forward to another great article. Good luck to the author! All the best!
Php projects with source code
Online examination system in php
Student management system in php
Php projects for students
Free source code for academic
Academic projects provider in nashik
Academic project free download

sathishkumar said...

hadoop training in bangalore | hadoop online training
iot training in bangalore | iot online training
devops training in banaglore | devops online training

sanjay said...

I would like to thank you for sharing this great information with us. I am really glad to learn about this because it helps me to increase my knowledge.
| Certification | Cyber Security Online Training Course | Ethical Hacking Training Course in Chennai | Certification | Ethical Hacking Online Training Course | CCNA Training Course in Chennai | Certification | CCNA Online Training Course | RPA Robotic Process Automation Training Course in Chennai | Certification | RPA Training Course Chennai | SEO Training in Chennai | Certification | SEO Online Training Course

Aaditri Technology said...

Aaditri Technology (Best Web Design Company) is a professional website or web design company in Delhi. We are offering cost effective Web Designing, Web Development, Logo Designing, SEO Services, digital marketing & internet marketing solutions. For more details visit our website.

Joomla Development Company

Logo Designers in Delhi
Ecommerce website development Delhi
Best Web Designing Company in Delhi

Ankita Sharma said...

Girlsncurls is an online shop where you can shopping for Clothing & Accessories from a great selection of Lingerie, Nightwear, Loungewear and more at everyday low prices.

Buy Sports Bra Online
Beginners and Teenagers Bra
Women's Cotton Bra Online
Nightie and Rob Wear Online

Dinkcart said...

Dinkcart is famous and reputed company in Delhi/NCR for manufacturing of printed t-shirts. Get customized t shirts for various purpose and occasions.
Birthday Tees Online
Mom –Son Tees Online
T shirt Photo Printing Online
Women’s Jegging Online
Sublimation Printing Services in Delhi

ANSON SPORTS said...

Gym and Fitness equipment store in India - Buy best quality Exercise & Fitness equipment's online for lowest price at Ansonsports.com

buy dumbbell online in india
online sports and fitness shop in india
buy fitness equipments online
buy sports goods online

Unknown said...

Book online best pandit for all kinds of pooja program, Graha Shanti, festivals pooja, and all your religious programs from ravindrashastri.com

Book Pandit Ji Online
Astrologer in Laxmi Nagar
Pandit ji for Satyanarayan Katha in Vaishali

Medy Cart said...

Many of us bear muscle pain each day. Buy Tramadol Online, and find immediate relief to your daily muscle pain. Relax your muscles now.