Try using <formula> instead of <column> to define the associations:
Code:
<hibernate-mapping package="foo">
<class name="TableOne">
<composite-id>
<key-property name="key1" column="PKCOLUMN1" type="string" />
<key-property name="key2" column="PKCOLUMN2" type="string" />
</composite-id>
</class>
<class name="TableOtherOne">
<composite-id>
<key-property name="key3" column="PKCOLUMN3" type="string" />
<key-property name="key2" column="PKCOLUMN2" type="string" />
</composite-id>
</class>
<class name="TableMany">
<composite-id>
<key-property name="key3" column="PKCOLUMN3" type="string" />
<key-property name="key1" column="PKCOLUMN1" type="string" />
</composite-id>
<property name="key2" column="PKCOLUMN2" />
<many-to-one name="association1" class="TableOne">
<formula>key1</formula>
<formula>key2</formula>
</many-to-one>
<many-to-one name="association2" class="TableOtherOne">
<formula>key3</formula>
<formula>key2</formula>
</many-to-one>
</class>
</hibernate-mapping>
generates DDL:
Code:
create table TableMany (
PKCOLUMN3 varchar(255) not null,
PKCOLUMN1 varchar(255) not null,
PKCOLUMN2 varchar(255),
primary key (PKCOLUMN3, PKCOLUMN1)
);
create table TableOne (
PKCOLUMN1 varchar(255) not null,
PKCOLUMN2 varchar(255) not null,
primary key (PKCOLUMN1, PKCOLUMN2)
);
create table TableOtherOne (
PKCOLUMN3 varchar(255) not null,
PKCOLUMN2 varchar(255) not null,
primary key (PKCOLUMN3, PKCOLUMN2)
);