2010-12-02 58 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。