2010-12-02 67 views
0

嗨 我有父母與子女表像下面插入到父和子表

<?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> 

和.cs文件我有這樣編寫的代碼像下面插入到父母和孩子。

 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(); 

如果我在上面的代碼中提交「Line 1」,則只有小孩正在插入。如果我評論「第2行」外鍵約束錯誤正在拋出。

表:

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,) 

請讓我知道如何在父母子女在單個保存操作一次插入。

+0

任何你沒有在分配給st.StudMarks之前將'sm'添加到'sms'列表中的原因? – 2010-12-02 04:49:08

+0

我加了sms.Add(sm);在「Line 1」之前,並且在不更改hbm文件的情況下工作。非常感謝。 – jcreddy 2010-12-02 05:38:58

回答

0

我相信你需要在Student映射的StudMarks集合屬性上指定inverse="true",指示​​映射是關係的所有者。

1

您有一個來自Student-> StudentMarks的級聯關係。所以,你應該節省ST ...

session.Save(st); 

你也應該指定逆放在包裏=「真」這樣你就不會得到外鍵和級聯=「全刪除,孤兒的雙重更新「在這裏可能是適當的,因爲您希望刪除學生時刪除所有StudentMark。