Sanjay,
re a) looking at the code, there is not much of a difference. One requires you to provide amn instance, the other wants the Class of the mapping. There is an additional check in addMapping: that's not in newMapping: , but that's it. Out of my head, I couldn't tell you which one I use.
re b) I never asked myself this question. My take is that it helps to check plauisbilities and also auto-determine the mappings for foreign keys etc. I see little reason why it would be absolutely necessary, and I always implement it. Maybe it's a waste of time, I dunno. I am too busy solving hard Glorp problems to even wonder ;-)
c) is the only one of your questions I think I can help answer. You can provide two different each with a JOIN that makes the relation between the tables explicit.
(aDescriptor newMapping: OneToOneMapping)
attributeName: #emergencyCoodinator;
referenceClass: Teacher;
mappingCriteria: (Join
from: (table fieldNamed: 'EMERGENCY_COORDINATOR')
to: ((self tableNamed: 'Teacher') fieldNamed: 'ID'))).
(aDescriptor newMapping: OneToOneMapping)
attributeName: #classTeacher;
referenceClass: Teacher;
mappingCriteria: (Join
from: (table fieldNamed: 'CLASSTEACHER
to: ((self tableNamed: 'Teacher') fieldNamed: 'ID')))
HTH
Joachim