如何使用额外的列在 Hibernate 中映射多对多关系

How to map many-to-many relation in Hibernate with a extra columns

我想使用 XML 在 Hibernate 中映射一个 多对多 关系 映射 .
我有两个 类、VoitureCient。我想创建一个 link table Reservation 将包含复合键 (idClient,idVoiture) 和 3 个额外的列 (dateReservation,duree,prix)

将其映射为具有多对一的复合元素:

<list ... table="LinkTable">
  ...
  <key>
    <column name="idClient" />
  </key>
  <composite-element class="MyLinkType">
    <property name="DateReservation" />
    <property name="Duree" />
    <property name="Prix" />
    <many-to-one name="Voiture" column="idVoiture" class="Voiture" />
  </composite-element>
</list>

仔细考虑如何使其成为双向的。复合元素是属于列表所有者的映射属性。

或者,使 link table 成为它自己的实体。

我这样做了,是真的吗?:

Client.java:

@ManagedBean
@ViewScoped
public class Client implements Serializable
{
private static final long serialVersionUID = 1L;    
private Long idClient;
private String nom;
private String prenom;
private String cin;
private String adresse;
private String login;
private String pass;
private String numTel;
private Set<Voiture> voitures=new HashSet<Voiture>();
}

Client.hbm.xml:

 <?xml version="1.0"?>
 <!DOCTYPE hibernate-mapp`ing PUBLIC
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="dao.Client" table="CLIENTS" >
<id name="idClient" column="ID_CLIENT">
<generator class="native"></generator>
</id>
<property name="nom" column="NOM"></property>
<property name="prenom" column="PRENOM"></property>
<property name="cin" column="CIN"></property>
<property name="adresse" column="ADRESSE"></property>
<property name="login" column="LOGIN"></property>
<property name="pass" column="PASS"></property>
<property name="numTel" column="NUM_TEL"></property>
    <set name="voitures" 
        lazy="true"
        cascade="all-delete-orphan">
       <key column="ID_VOITURE" />
       <one-to-many class="voiture"/>
    </set>
    </class> 

Voiture.java:

 @ManagedBean
 @ViewScoped
 public class Voiture implements Serializable {
 private static final long serialVersionUID = 1L;
 private Long idVoiture;
 private String marque;
 private String moteur;
 private String type;
 private Long annee;
 private Long places;
 private String boite;
 private String climatisation;
 private Double prix;
 private String dispo;
 private String image;
 private Set<Client> clients=new HashSet<Client>();
 }

Voiture.hbm.xml:

 <?xml version="1.0"?>
 <!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 <hibernate-mapping>
 <class name="dao.Voiture" table="VOITURES">
 <id name="idVoiture" column="ID_VOITURE">
 <generator class="native"></generator>
 </id>
 <property name="marque" column="MARQUE"></property> 
 <property name="type" column="TYPE"></property>
 <property name="prix" column="PRIX"></property>
 <property name="dispo" column="DISPO"></property> 
 <property name="climatisation" column="CLIMATISATION"></property>
 <property name="boite" column="BOITE"></property>   
 <property name="annee" column="ANNEE"></property>
 <property name="image" column="IMAGE"></property>
 <property name="places" column="PLACES"></property>
 <property name="moteur" column="MOTEUR"></property>
 <set name="clients" lazy="true" cascade="all-delete-orphan">
       <key column="ID_VOITURE" />
       <one-to-many class="client"/>
 </set>
 </class>
</hibernate-mapping>

Reservation.java:

 @ManagedBean
 @ViewScoped
 public class Reservation implements Serializable 
 {
 private static final long serialVersionUID = 1L;
 private Long idClient;
 private Long idVoiture;
 private Date dateReservation;
 private Long duree;
 private double prix_total;
 }

Reseravation.hbm.xml:

 <?xml version="1.0"?>
 <!DOCTYPE hibernate-mapping PUBLIC
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 <hibernate-mapping>
 <class name="dao.Reservation" table="RESERVATIONS">
 <composite-id>    
    <key-many-to-one name="idClient" column="ID_CLIENT" class="CLIENT"/>
    <key-many-to-one name="idVoiture" column="ID_VOITURE" class="VOITURE"/>
 </composite-id>
 <property name="dateReservation" column="DATE_RESERVATION"/>
 <property name="duree"  column="DUREE"  />
 <property name="prix_total"  column="PRIX_TOTAL" />
 </class>
 </hibernate-mapping>