If Hibernate already has the object loaded, you're not going to get an additional query happening - it's very smart.
However, I'd start to call into question your object model if you're going to having a lot of PersonWithAddress.Address equaling PersonWithAddress.Person.Address. This make sense if home/shipping/billing are different addresses, though.
In a larger view, from one Hibernate newbie to another, you might enjoy this piece of insight I gleaned.
My first thoughts in using Hibernate when I started many months ago was that I'd do all my database design and then try to mush Hibernate over it. Doing it that way was awful.
Seriously, don't think about the database. Think about the object model.
Code:
@Entity
class Address { ... }
@Entity
class Person {
Address address;
}
@Entity
class PersonWithAddress {
Person person;
Address address;
}
Then generate your schema. What you'll find is that Hibernate does not just the right thing, but the efficient thing, often coming up with a better, tighter DDL solution that you'd do by hand.
Each entity, in the case above, has its own life-cycle, and is managed by foreign keys. A couple of annotations later and you can have cascading deletes.
Bottom line: yes, Hibernate will do what you want. In fact, it will be almost magical with its database optimizations.
-wls