2010-12-02 6 views
0

Salut Je table parent et de l'enfant comme ci-dessousaux tables parent et enfant

<?xml version="1.0" encoding="utf-8"?> 

        ------- parent -------------- 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="HibernateSample.StudMarks,HibernateSample" table="StudMarks" lazy="false"> 
    <id name="Sno" column="SNO" type="int"> 
     <generator class="assigned"/> 
    </id> 
    <many-to-one name="Student" column="ID" not-null="true"/> 
    <property name="Marks" column="Marks" type="int" not-null="true" /> 
    <property name="Rank" column="Rank" type="int" not-null="true" /> 
    </class> 
</hibernate-mapping> 

       ------- child -------------- 
<?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="HibernateSample.Student,HibernateSample" table="Student" lazy="false"> 
    <id name="Id" column="ID" type="int"> 
     <generator class="native" /> 
    </id> 
    <property name="Name" column="Name" type="string" not-null="true" /> 
    <property name="Standard" column="Standard" type="string" not-null="true" /> 
    <bag name="StudMarks" cascade="all" lazy="false"> 
     <key column="ID" not-null="true"/> 
     <one-to-many class="HibernateSample.StudMarks,HibernateSample" /> 
    </bag> 
    </class> 
</hibernate-mapping> 

et .cs fichier que j'ai le code comme écrit comme ci-dessous pour insérer dans parent et l'enfant.

 StudMarks sm = new StudMarks(); 
     Student st = new Student(); 
     List<StudMarks> sms = new List<StudMarks>(); 
     st.Id = 9; 
     st.Name = "stud 999"; 
     st.Standard = "99"; 
     sm.Sno = 9; 
     sm.Marks = 99; 
     sm.Rank = 9;    

     sm.Student = st;    ------ **Line 1** 
     st.StudMarks = sms;   ------ **Line 2** 

     session.Save(sm);    
     session.Flush(); 

Si je commente « Ligne 1 » dans le code ci-dessus enfant unique est l'insertion. Si je commente "Line 2", une erreur de contrainte de clé étrangère est lancée.

Tables:

CREATE TABLE [dbo].[Student](
[ID] [int] IDENTITY(1,1) NOT NULL, -- PRIMARY KEY 
[Name] [varchar](50) NOT NULL, 
[Standard] [varchar](50) NOT NULL, 

CREATE TABLE [dbo].[StudMarks](
[SNO] [int] NOT NULL, -- PRIMARY KEY 
[ID] [int] NOT NULL, -- FOREIGN KEY 
[Marks] [int] NOT NULL, 
[Rank] [int] NOT NULL,) 

S'il vous plaît laissez-moi savoir comment insérer dans parent et l'enfant à un moment seule opération sauver.

+0

Quelle est la raison pour laquelle vous n'ajoutez pas 'sm' dans la liste 'sms' avant d'assigner à st.StudMarks? –

+0

j'ai ajouté sms.Add (sm); avant "Ligne 1" et travaille sans changer le fichier hbm. Merci beaucoup. – jcreddy

Répondre

0

Je crois que vous devez spécifier inverse="true" sur le mappage Student de la propriété de collection StudMarks, indiquant que le mappage StudMark est le propriétaire de la relation.

1

Vous avez une relation en cascade de Student-> StudentMarks. Donc, vous devriez économiser st ...

session.Save(st); 

Vous devez également spécifier inverse = « true » sur le sac afin de ne pas doubles mises à jour de la clé étrangère et une cascade = "all-delete-orphan "est probablement approprié ici car vous voulez que tous les StudentMarks soient supprimés lorsque l'Etudiant est supprimé.

+0

j'ai ajouté sms.Add (sm); avant "Ligne 1" et travaille sans changer le fichier hbm. Merci beaucoup. – jcreddy