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.

149 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

bal 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.

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

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

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

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

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

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

Anonymous said...

Visit here for more info : Hadoop Training in Bangalore

Training for IT and Software Courses 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

Training for IT and Software Courses 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

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

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

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
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

Ab Kashyap said...
This comment has been removed by the author.
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 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......

Nisar said...

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

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

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

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

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

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

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


Anonymous 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

Anonymous said...
This comment has been removed by the author.
Anonymous said...
This comment has been removed by the author.
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

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

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

Rajendra Shastri | Pandit ji for Pooja 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.

haroon said...

such a nice blog..very helped to us..


Ansys cadd center in coimbatore
Ansys course in coimbatore
Ansys course fees in coimbatore
Ansys course training in coimbatore
Best Ansys course in coimbatore
Ansys course training with placement in coimbatore
Ansys online training course in coimbatore
Ansys online course in coimbatore
Ansys fees structure in coimbatore
Ansys jobs in coimbatore
Ansys training in coimbatore
Cadd centre in coimbatore
Cadd course in coimbatore
Cadd centre fees structure in coimbatore

WashiK_KhaN said...

Your article was perfect had helped me alot in finding the right thing i had searching this stuff thank you so much for provding me this information.me been very sad after reading this announcement…


jantar mantar in delhi


insectsight


womens cardigans

tour to kodaikanal

places to visit in naintal

places to visit in delhi

Amrita Bansal said...

Good Post! it was so good to read and useful to improve my knowledge as an updated one, keep blogging.

Data Analytics Training in Gurgaon

Fiducia Solutions said...

Fiducia Solutions is an ISO certified institute providing course certifications to all its students. We, at Fiducia Solutions, see to it that the candidate is certified and entitled to bag a good position in acclaimed companies. We provide certificates that are valued, and our alumni reputation proves that we are good at what we offer.

And that is not all! We are known to provide 100% live project training and 100% written guaranteed placements to our students. That’s what makes us the best PHP/ HR/ Digital Marketing training institutes in Noida and Ghaziabad.


PHP Training Institute in Noida
HR Training Institute in Noida
Digital Marketing Training Institute in Noida

Shweta Singh said...

Hello,

Great Post. It's very Useful Information. In Future, Hope To See More Post. Thanks You For Sharing.
CTET Coaching In Noida
UPTET Coaching In Noida
B.Ed Entrance Coaching In Noida
Thanks
Shweta Singh

Amrita Bansal said...

I am looking for and I love to post a comment that "The content of your post is awesome" Great work!

SQL Training in Gurgaon
Advanced Excel /VBA training in Gurgaon

Best Training Institute said...

Thank you For your Valuable Info.
Hibernate training in bangalore

Nitish thakur said...

Hello to all
Himachal News

John said...

This blog is very helpful for PPC Course Delhi and keep share more information

Anonymous said...

Nice post.Thanks for sharing with us.
python training in Bangalore

salome said...

useful blog.its very interesting to read
devops Training in chennai | devops Course in Chennai

ram said...

It was wonderfull reading your article. Great writing styleIamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder

Ashleel Londa said...

It was wonderfull reading your article. Great writing styleiamlinkfeeder iamlinkfeeder iamlinkfeeder iamlinkfeeder iamlinkfeeder iamlinkfeeder iamlinkfeeder iamlinkfeeder iamlinkfeeder iamlinkfeeder

Rohit said...

Kim Ravida is a lifestyle and business coach who helps women in business take powerful money actions and make solid, productiveIamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder

manjot singh said...

Thanks for the Valuable information.Really useful information. Thank you so much for sharing. It will help everyone.

SASVBA is recognized as the best machine learning training in Delhi. Whether you are a project manager, college student, or IT student, Professionals are the best machine learning institute in Delhi, providing the best learning environment, experienced machine learning instructors, and flexible training programs for the entire module.

FOR ORE INFO:

Thakur98 said...

We are used to the fact that we know only religious and public holidays and celebrate only them.Iamlinkfeeder Iamlinkfeeder Iamlinkfeeder Iamlinkfeeder Iamlinkfeeder Iamlinkfeeder Iamlinkfeeder Iamlinkfeeder Iamlinkfeeder

aishu said...

Awesome post.Thanks for sharing. AWS Training in Chennai

aishu said...

Awesome post.Thanks for sharing. AWS Training in Chennai

salome said...

thank you .useful blog
best-angular-training in chennai |

angular-Course in Chennai

nayar said...


Nice blog! Thanks for sharing this valuable information
RPA Training in Bangalore
RPA Training in Pune
RPA Training in Hyderabad
RPA Training in Gurgaon

nayar said...

Great post.Thanks for sharing such a worthy information...
Python Training in Bangalore
Python Classes in Pune
Python Training in Hyderabad
Python Classes in Gurgaon

Python said...

Thanks for sharing.
Python Online Training

Rahul Gupta said...

if you are looking for a digital marketing training in meerut then you can go for webinside institue.

Unknown said...

jan adhar card very usefull in rajsthan govt. All Process in Download See Now

Himachal News Network said...

Welcome to CapturedCurrentNews – Latest & Breaking India News 2021
Hello Friends My Name Anthony Morris.latest and breaking news drupepower.com

JOB CIRCULAR said...

One of the best articles is this. I am looking for this article for a long time. At last, I found this on your website. Many many thanks for sharing your content.
Bangla Calendar 2022
Cool and beautiful stylish name

manasa said...

I like this post, And I figure that they living it up to scrutinize this post, they may take a respectable site to make an information, thanks for sharing it to me Pretty great post…

Data Science Training in Hyderabad

Daulat Hussain said...

Thanks for sharing this incredible article.

Please give your review on Penial Size

Unknown said...

bar bending machine in ahmedabad

bar bending machine

bar bending machine up to 40mm

bar bending machine up to 32mm

Soureessay said...

Very enthusiastic article, add so much useful information to me.essay rewriter birmingham

Devi said...

Infycle Technology, No.1 Software Training Institute in Chennai, afford best Data Science course in Chennai and also provide technical courses like Oracle, Java, Big data, AWS, Python, DevOps, Digital Marketing, Selenium Testing, etc., and we also provide the best training from the best technical trainers and after completion of training students will be able to crack the jobs on top MNC’s. for more information call 7504633633.

DailyTrendsPro said...

Awesome Nice article you can visit my site also Visit DailytrendsPro

Unknown said...

Grab the best AWS training and placement in chennai from Infycle Technologies, the best software training institute, and Placement centre in Chennai. We also provide technical courses like Power BI, Cyber Security, Graphic Design and Animation, Block Security, Java, Oracle, Python etc. For free demo class and enquiry call 7504633633.

United said...

Thank you for sharing the information.


MPM Corner

Jumma Mubarak
tnmachiDa
teluguwap net
Coolmoviez
up Scholarship
Om Jai Jagdish
skymovies

DHIVYA NAWIN SANTH P S said...

Check out the latest news, breaking news, Trending news and all useful lifestyle, technology and job notifications visit the website latest news, breaking news on Medico topics

David Fincher said...

This post is so interactive and informative.keep update more information...
Ethical Hacking Course in Anna Nagar
Ethical Hacking Course in Chennai

Karin said...

The past two years have been a roller coaster ride for event managers as they pivot toward virtual event and hybrid strategies amid the twists and turns of a wildly unstable pandemic environment. Along the way, they’re dealing with a flood of new event technologies that often come with steep learning curves and inadequate support. debrief report, what is guerilla marketing, what is an nft, what is metaverse, speaker bio template free, vendor setup ideas, thank you email to speakers after event and business lunch invitation wording

Anonymous said...

Hi, Thanks for sharing wonderful articles....

RTI Online Bihar

Pavithra Devi said...

This post is so interactive and informative.keep update more information...
Python Training in Tambaram
Python training in chennai

Matt Reeves said...


Great post. Thanks for sharing such a useful blog.
Ethical Hacking Course in Anna Nagar
Ethical Hacking Course in Chennai

Sun Industries said...

bar bending machine

Cari said...


You should take help from professionals who have immense experience on Microsoft Business Central. They will help you with Solutions easily. Read: Dynamics 365 Business Central Vs Dynamics 365 Finance & Supply Chain Management

Full Stack Development said...

In this Growing Digital world demand for Software Testing is increasing being in demand SevenMentor came up with all fresh courses of Software Testing Training In Pune.

Makeup Artist Course in Gurgaon | Makeup Artist Institute in Gurgaon | Best Makeup Artist Course in Gurgaon | Best Makeup Artist Institute in Gurgaon | Makeup Artist Course | Makeup Artist Institute said...

https://lookobeauty.com/makeup-artist-institute-makeup-artist-course-in-gurgaon/

Nice Content

frpgreek said...

Awesome Nice article you can visit my site also Blog Tips Zone

frpgreek said...

Click Here To Get Blogging Information

frpgreek said...

Awesome Nice article you can visit my site also Blog Tips Zone
Click Here To Get Blogging Information

designingcourses said...


https://designingcourses.in/graphic-designing-courses-in-bangalore/

Learn graphic designing courses in bangalore we provide best graphic designing training and 100% placement assistance

Aquaman said...

Step-by-Step Hacking Tutorials about WiFi hacking,
Kali Linux, Metasploit, exploits, ethical hacking, information security, malware analysis and scanning
hacking

Sonam Gangwar said...

Are you looking for a way to watch the latest Pathan movie in high-quality and for free? Look no further! Here we provide you with the best options to Pathan Full Movie Download 4K, HD, 1080p 480p, 720p in Hindi quality for free in Hindi. We have compiled a list of reliable sources that offer the highest quality streaming and downloading services. So get ready to dive into the world of Pathan with this ultimate guide on how to download it for free !

iteducationcentre said...

Your article is worth reading. Thanks for posting such a superb article.
Data science classes in Pune

Vrusha said...

Thank you for sharing the valuable points and good updates here...

I am running few ads for my tiktok app and how to know the tiktok ads not spending and ads are not running..?


I want to buy a peacock app and looking for a student discount peacock app to get a discounted prices...

web designing Training in bangalore said...

Spot on with this write-up, I seriously believe that this web site needs far more attention. I’ll probably be returning to read more, thanks for the information!

https://infocampus.co.in/full-stack-development-training-in-marathahalli.html
https://infocampus.co.in/web-development-training-in-bangalore.html

deekshitha said...

Begin your 360DigiTMg Data Science online course right away to be prepared for the next time a career opportunity arises.data science course training in faridabad

BloggerX said...

Hello it was a nice post. I am am a Dating expert from USA. You must also see Local Dating Sites in USA

BloggerX said...

Please do check out some Make money facts

Eimple Labs said...

Eimple Labs born to prepare an industry ready workforce. As a product based company Eimple Labs ensures to inculcate the end to end live product development and management skills. We work in a university-industry partnership and implement a holistic knowledge-imparting model to prepare students for new-collar jobs in emerging industries.

pratikshaK said...

Nice blog, thanks for shearing. Java Training In Pune

cgrty said...

I'm so glad I came across this post, it was incredibly informative and knowledgeable.
I look forward to seeing more of your content, thank you Also Find Latest Egg Rates in India Egg Rate In India

Rupesh Kumar said...

Thanks for posting the best information and the blog is very informative. Experience the power of online English tuition classes to boost your language proficiency! Join our expert-led, interactive sessions designed to improve your grammar, vocabulary, comprehension, and communication skills.
For more info visit Online English Tuition

pal sokcoc said...

Thank you so much for this amazing blog. As far as I could find, this is by far the best summary on this topic.

IT Education said...

Thanks for sharing this post.Machine Learning Course in Pune

Akash said...
This comment has been removed by the author.
Programming Edu said...

This blog is a valuable, up-to-date resource with engaging content. Check our IT Certification Course by SkillUp Online.

Robert said...

I am looking for such content only as it will help me out in my blue prism certification. Looking forward for more such contents.

Mishra A said...

Your writing is incredibly captivating; I found it hard to put down! The eloquence with which you convey ideas is truly engaging and enthralling.
Best Software Training Institute In Electronic City Bangalore

Rishav said...


Extremely helpful article !!Please visit:
hellotechhub
Windows Help and Support
QuickBook Support
Computer Repair Services

123tws webdesign company said...

very useful information. keep rocking.
seo packages india
Whatsapp marketing software in coimbatore
real estate crm software india

vcube said...

Excellent information, which I truly valued. It's easy to read and has a lot of potential, so I've bookmarked it for future reference. Thank you for sharing, pro. It appeals to me.
AWS Training Institute in Hyderabad

sky way said...

thanks for the information.
adarsh welkin park

provident east lalbagh

PlanAtDigital said...

The heart of Kochi is home to Plan At Digital, a training institute and service centre for digital marketing. We train students in search engine optimisation (SEO), pay per click (PPC), social media optimisation (SMO), and digital marketing courses in Kochi for diploma programmes. Our services and training enable professionals in marketing, business, entrepreneurship, aspirants, and education to succeed in their fields as independent contractors or students.

rajk939291 said...

Great Article Thank you.
ELearn Infotech offers Python Training in Hyderabad Madhapur. Our Python course includes from Basic to Advanced Level Python Course. We have designed our Python course content based on students Requirement to Achieve Goal. We offer both class room Python training in Hyderabad Madhapur and Python Course Online Training with real time project.

IT TRAINING said...

this blog is very useful and beautiful us

INFORMATION TECHNOLOGY