If you declare your OrderType object as a proxy, then when you do the following code:
Code:
Order order = new Order();
...
OrderType orderType = session.load(OrderType.class, orderTypeKey);
session.save(order);
Hibernate will issue the same SQL you would have issued yourself using direct JDBC.
When you call the load() method for the proxied object, Hibernate will just *assume* that a row exists in the appropriate table for the given OrderType key. It will then create a proxy OrderType instance (which looks just like a normal OrderType to you) and return that. After you hook that up to your Order and then call save(), Hibernate will see that the OrderType is a proxy and will only issue the SQL insert statement for the Order instance.
There's lots more info about proxies and reducing SQL statements and whatnot in the manual.