The final
keyword prevents anyone from extending the class and override any of its methods.
To implement lazy-loading, hibernate replaces the instance of the parent object at the many side by a proxy. The first time it's called, this proxy loads the data of the parent from the database.
The proxy must be an instance of the Parent class. But it can't be of type Parent, since its methods need to do something else: execute a SQL query the first time they're called. So the proxy is in fact a subclass (dynamically generated at runtime) of Parent. And to be a subclass, the Parent class can't be final.
So final
must be avoided on hibernate entities, else proxies and thus lazy-loading won't work.