Forget the distraction of "implicit polymorphism" and "both sides abstract". They're irrelevant.
Be warned that Hibernate cannot support list-to-list at all (A many-to-many association, when both sides are ordered).
Look at the following mapping:
Code:
<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
<list name="addresses" table="PersonsAddresses">
<key column="personId" not-null="true"/>
<list-index column="personSortOrder"/>
<many-to-many class="Address" column="addressId"/>
</list>
</class>
<class name="Address">
<id name="id" column="addressId">
<generator class="native"/>
</id>
<list name="people" table="PersonsAddresses">
<key column="addressId" not-null="true"/>
<list-index column="addressSortOrder"/>
<many-to-many class="Person" column="personId"/>
</list>
</class>
This will fail in Hibernate. The problem is that Hibernate updates the association from only one side, and that side is ignorant of the sortOrder column of the other side. So, e.g., it will update Person and attempt to insert a new row into the PersonAddresses table with column addressSortOrder as null, obviously causing an exception. no amount of 'inverse="true" trickery helps.
If you're willing hold your nose, you can always generalize the "make the index a 'property'" workaround and write a "myIndexInTheOtherGuysList" method.