Hi Brendan,
Are the "Team", "Department", etc.. entities very similar? I am assuming there is a degree of over-lap if you are using a mapped superclass.
If so, my suggestion would be to put all types in a single (well managed!) table.
Doing this (and yes, using inheritance... but without the performance hit) you will have the table mapped in a base entity class (say, "Stuff"). Your table will contain an attribute that is a discriminator, probably an integer, to describe the type of that entry (eg, Team).
This base JPA mapping class will contain all of the table attributes that are common to all of your types.
After the @Entity and @Table annotations, include the following:
@Inheritance(strategy= InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="type", discriminatorType=DiscriminatorType.INTEGER, length=1)
Then, each of your types (Team, Department, etc..) will be mapped w/ a class extending the base table. The class will be annotated with:
@Entity
@DiscriminatorValue(<type int value>)
.. and the class will define all of the attributes which are not common to all types.
And finally, in the end, you will be able to have a List<Stuff> in, for example, your Team class. The discriminators are used to instantiate every "Stuff" item appropriately, so you will get back a list of Team, Department, etc... items.
The bi-directional mapping can be captured in a simple lookup table w/ <stuff item id>, <stuff item id> attributes.
Hope this helps,
Shannon