In our experience the limitation is the performance of the database. But there are some situations that have hit us in the past.
N+1 select problem: We had a non-lazy entity referenced from a many-to-one association. This caused lots of additional selects against the database as we iterated the result set from a query. We didn't need the data so the solution was making the entity lazy. This was a long time ago when the default setting was lazy=false. Since that has changed to lazy=true it is not likely to happen anymore. On the other hand, if the associated data is needed it will not help to use lazy fetching. Then your query should
fetch join the association to bring in all data in a single query.
Auto flush mode: Beware of the AUTO flush mode when you handle a lot of entities in a session. If Hibernate decides that flush is needed it will dirty-check all entities which may take a long time. We were importing data from text files. It was a single table, one entry on each line and just a few properties. However, we needed to check if a new row should be inserted or if an existing one should be updated. The query to do this check triggered a flush+dirty-check in Hibernate. As the session filled up with entities each iteration took more an more time. After about 10000 rows it was really slow. There are two solutions.
- Do not use AUTO flush mode.
- Evict entities from the session as soon as they are no longer needed.
As far as I remember the two things above are the only Hibernate-related performance issues we have had. But they could be solved and if anything else pops up I am sure that it can be solved as well.