Well in fact you _can_ use generated ids for acheiving the same end.
Instead of using composite ids (which is something of a performance in Hibernate), I found it simpler to write my own net.sf.hibernate.id.IdentifierGenerator subclass.
That tiny code generated a unique identifier for a class based on a number of the class' properties.
The generation algorithm can be as simple as
string concetanation or the md5 hash of larger combinations of data.