hibernate is ubiquitous and quite simple to start with. but i met only frustration and dispair, when working with hibernate. there are thousands annoying bugs in bug tracker, documentation lack details (so you are forced to read a book)
heavy use of hibernate results in enormous memory consumption(so manual flushes are a must).
deadlocks are a usual thing and hibernate dont allow to tune locking order.
hibernate don't work with database constraints nicely.
entity state can only be managed from one side of bidirectional relationship.
proxy usage in not trivial when implementing equals or polymorphism. proxy visitor pattern is an example of proxy ugliness.
duplicated entities when doing join fetch is just ridiculous. don't tell me about OUTER joins - if there is always master entity, hibernate should always do master left join child. any solution offered by hibernate community results in perfomance problem - using Set results in duplicates send over network and increasing network load, using distinct projection results in filesort in most databases.
overall, hibernate was a performance issue in our last project. hubernate took much time mantaining it's own session and collection, each commit took seconds(!)