J'ai mis en place ce mapping pour tenter de représenter la situation évoquée ci-dessus :
Code:
<hibernate-mapping>
<class name="Member" table="member">
<id name="id" column="member_id">
<generator class="native" />
</id>
<join table="preferred_followed_city_member" inverse="true" optional="true">
<key column="member_id" />
<many-to-one name="preferredFollowedCity" column="city_id" not-null="true" />
</join>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="City" table="city">
<id name="id" column="city_id">
<generator class="increment" />
</id>
<set name="membersWhoPreferCity" table="preferred_followed_city_member">
<key column="city_id" />
<many-to-many column="member_id" unique="true" class="com.livemeteo.model.member.Member" />
</set>
</class>
</hibernate-mapping>
Maintenant voilà ce que me génère ce mapping en MySQL :
Code:
CREATE TABLE IF NOT EXISTS `city` (
`city_id` int(11) NOT NULL,
PRIMARY KEY (`city_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `member` (
`member_id` int(11) NOT NULL auto_increment,
PRIMARY KEY (`member_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `preferred_followed_city_member` (
`member_id` int(11) NOT NULL,
`city_id` int(11) NOT NULL,
PRIMARY KEY (`city_id`,`member_id`),
KEY `FK6C040F3DFB2395E8` (`member_id`),
KEY `FK6C040F3D8DF79E17` (`city_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
J'ai suivi le modèle de mapping de la documentation Hibernate pour créer une association bidirectionnelle avec table de jointure (un à plusieurs)
http://www.hibernate.org/hib_docs/v3/reference/fr/html/associations.html#assoc-bidirectional-join-12m.
Pourtant je n'obtiens pas le même résultat généré en terme de table que ce qu'ils décrivent dans la doc. En particulier, je me retrouve avec une clé primaire composée de mes deux clés étrangères.
J'avoue ne pas voir le problème, mon mapping me semble bien fait.