Bonjour à tous
J'ai les tables suivantes :
Quote:
CREATE TABLE student (
"std_id" SERIAL NOT NULL,
"std_firstname" VARCHAR(125),
"std_lastname" VARCHAR(125),
....
CONSTRAINT "pk_student" PRIMARY KEY("std_id"),
....
);
CREATE TABLE address (
"adr_id" SERIAL NOT NULL,
"adr_postcode" SMALLINT(4) NOT NULL,
...
CONSTRAINT "pk_address" PRIMARY KEY("adr_id")
);
CREATE TABLE contact (
"con_id" SERIAL NOT NULL,
"con_name" VARCHAR(255),
"adr_id" INTEGER,
...
CONSTRAINT "pk_contact" PRIMARY KEY("con_id"),
CONSTRAINT "fk_contact_address" FOREIGN KEY ("adr_id")
REFERENCES "address"("adr_id") ON DELETE RESTRICT ON UPDATE CASCADE
);
CREATE TABLE student_contact (
"std_id" INTEGER NOT NULL,
"con_id" INTEGER NOT NULL,
"default" BOOLEAN DEFAULT FALSE,
"type" INTEGER NOT NULL,
CONSTRAINT "pk_student_contact" PRIMARY KEY ("std_id", "con_id"),
CONSTRAINT "fk_student_contact_student" FOREIGN KEY ("std_id")
REFERENCES "student"("std_id") ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT "fk_student_contact_contact" FOREIGN KEY ("con_id")
REFERENCES "contact"("con_id") ON DELETE RESTRICT ON UPDATE CASCADE
);
Comme vous pouvez le voir, j'ai une relation N:M entre
Student et
Contact.
- Un
Student peux donc avoir plusieurs
Contacts
- Chaque
Contact est représenté par un "type"
- Chaque
Student possède un
Contact par defaut
J'ai déjà un mapping fonctionnel pour
Student et pour
Contact dans lequel cette relation est ignorée (j'ai très rarement besoin d'un
Student avec toutes les informations de contacts et j'utilise
Contact dans d'autres relations sans raports avec
Student). Je voudrais avoir un mapping qui me permette de remonter toutes les informations sur
Student et
Contact (type de contact et qui est le contact par defaut) mais je ne vois pas comment transporter la valeur de "type" et de "default" dans polluer mes objets..
L'idéal (pour moi) serait d'avoir une classe
StudentDetails qui maintiendrais une collection (de n'importe quelle sorte) de
Contacts dans laquelle je pourrais retrouver les informations sur le "type" et le contact par defaut. J'ai donc commencé le mapping suivant :
Quote:
<hibernate-mapping >
<class name="me.StudentDetails" table="student">
<id column="std_id" name="id">
<generator class="sequence">
<param name="sequence">student_std_id_seq</param>
</generator>
</id>
<property column="std_firstname" name="firstName" />
<property column="std_lastname" name="lastName" />
<list name="contactDetails" lazy="false" table="student_contact">
<key column="std_id" />
<list-index column="con_id" />
<many-to-many class="me.StudentDetails.ContactDetails"
column="con_id" />
</list>
</class>
<class name="me.StudentDetails.ContactDetails" table="contact">
<id column="con_id" name="id" >
<generator class="sequence">
<param name="sequence">contact_con_id_seq</param>
</generator>
</id>
<property column="con_name" name="name" />
<many-to-one column="adr_id" name="address" lazy="false"
not-null="false" cascade="save-update" insert="true" />
</class>
</hibernate-mapping>
Mais je ne sais pas comment récupérer également les propriétés présentes dans la table de relation pour les insérer dans l'objet
ContactDetails.
Bien sur je pourrais ignorer la puissance d'Hibernate et faire un truc du style
Code:
public class StudentDao {
public List<Contact> getContacts(Integer studentId);
public List<Contact> getDefaultContact(Integer studentId);
}
Mais je suis sur que l'un d'entre vous à une solution plus élégante à me proposer..
Merci