Not sure if I can make it any clearer than all the resources you say you have already seen, but here it goes (maybe I can at least make it more condensed):
The issue has to do not so much with the entity itself defining equals/hashCode. Its more a problem of those entities which do define an equals/hashCode being included in a hash-based collection (such as sets and certain map implementations). The contract for those collection interfaces state that the value used to determine placement of the object within the given collection cannot change while the instance is contained in the collection. This is not a Hibernate requirement, these are contracts defined on those standard java collection interfaces; Hibernate simply magnifies it because if you use the db id as the basis for the hash-code (which logic makes the most sense) then you've just broken this contract if the id is assigned to an instance while that instance is included in such a collection.
Visualize what happens when you do this...
1) You load an entity of type A from the session; this entity has a set of entities of type B (assume the Set of Bs is marked with cascade all);
2) You then instantiate a new B and set its values;
3) You add this new B to the loaded A's set of Bs (at this point the Set impl calculates the internal storage position of that newly added B based on the hashCode() method)
4) You flush the session, at which time Hibernate will attempt to save the new B instance through its cascading association to A; here Hibernate or the DB generates the ID value and sets it on the B instance. At this point the contract with the Set interface has just been broken (assuming the hasCode() value is based on the PK).
Quote:
If you use manually assigned ids (eg the "assigned" generator), you are not in trouble at all, you just have to make sure to set the id before adding the object to the set.
Hopefully you'll undertand why that above statement is true given the explanation of the issue...
And no, currently there is no way to tell Hibernate to not initialize a proxy on equals() and/or hashCode() invocation.