When I read how, when using EJB3/Hibernate annotations, you only needed to annotate execptions to some basic rules, I thought "wow, finally...that's a great idea". Well, turns out I was wrong!

The way things are setup is that if you have any methods that begin with get, then according to the spec those are persistent properties and will by default be persisted as Basic properties. Now, never mind that any rich-type properties should probably be defaulted to ManyToOne properties...

I'm now coming to the realization that this strategy works really well if you have an anemic domain model. But our domain model is anthing but anemic. Probably over half of the get() methods on our classes compute derived values, or chain through other objects to find the result. So now I find that I have to go and annotate all these other methods with @Transient. Oh well, it's not a huge deal, but it does take some of the shine off.

I guess it's time to go look and see if there's a way to invert the behaviour at a class level so you can have the default be transient for a given class. And before anyone suggests it - yet the methods do need to begin with get because we want to be able to use them as read-only bean properties in all sorts of places.