A tutorial reader has two addresses, a billing and a delivery address. Only these address types are allowed. Full source code is provided in the package: de.laliluna.relation.typed
Classes | Tables |
<class name="TutorialReader" table="ttutorialreader"> ......... snip ......... <many-to-one name="billingAddress" entity-name="BillingReaderAddress" cascade="all" lazy="false"> <column name="billingaddress_fk"></column> <formula>'billing'</formula> </many-to-one> <many-to-one name="deliveryAddress" entity-name="DeliveryReaderAddress" cascade="all" lazy="false"> <column name="deliveryaddress_fk"></column> <formula>'delivery'</formula> </many-to-one> </class> <class entity-name="BillingReaderAddress" name="ReaderAddress" table="treaderaddress" where="type='billing'" check="type in('billing','delivery')"> <composite-id name="id" class="ReaderAddressId"> <key-property name="readerId" column="reader_id"/> <key-property name="type"/> </composite-id> <property name="address" type="string"></property> <property name="city" type="string"></property> </class> <class entity-name="DeliveryReaderAddress" name="ReaderAddress" table="treaderaddress" where="type='delivery'" check="type in('billing','delivery')"> <composite-id name="id" class="ReaderAddressId"> <key-property name="readerId" column="reader_id"/> <key-property name="type"/> </composite-id> <property name="address" type="string"></property> <property name="city" type="string"></property> </class>
The following tables are generated:
CREATE TABLE ttutorialreader ( id int4 NOT NULL, name varchar(255), billingaddress_fk int4, deliveryaddress_fk int4, CONSTRAINT ttutorialreader_pkey PRIMARY KEY (id) ) ; CREATE TABLE treaderaddress ( reader_id int4 NOT NULL, "type" varchar(255) NOT NULL, address varchar(255), city varchar(255), CONSTRAINT treaderaddress_pkey PRIMARY KEY (reader_id, "type"), CONSTRAINT treaderaddress_type_check CHECK ("type"::text = 'billing'::text OR "type"::text = 'delivery'::text), CONSTRAINT treaderaddress_type_check1 CHECK ("type"::text = 'billing'::text OR "type"::text = 'delivery'::text) )
Samples of use:
/* create and set relation */ TutorialReader reader = new TutorialReader(); reader.setName("Sebastian"); ReaderAddress billing = new ReaderAddress(new ReaderAddressId(reader .getId(), ReaderAddressId.BILLING), "Alte Landstrasse", "Frankfurt"); ReaderAddress delivery = new ReaderAddress(new ReaderAddressId(reader .getId(), ReaderAddressId.DELIVERY), "Neue Landstrasse", "Frankfurt"); reader.setBillingAddress(billing); reader.setDeliveryAddress(delivery); session.save(reader); /* select all billingReaderAddresses */ List list = session.createQuery("from BillingReaderAddress").list(); /* select tutorial reader with billing address in Bad Vilbel */ List list = session.createQuery("from TutorialReader r where r.billingAddress.city='Bad Vilbel' ").list();