1. 程式人生 > >hibernate一對多 更新

hibernate一對多 更新

hsnh6020】:
插入:
在Student中添屬性SC(SC表示課程表);
Student student = new Student();
SC sc = new SC();
student.setSC(sc);
在hibernate配置檔案中設定cascade=true,

getHibernateTemplate.save(student);
更新與插入類試;
getHibernateTemplate.update(student);

【deitecnu】:
樓上能否具體點

【jerryzl】:
學生Student.hbm.xml:
<hibernate-mapping>
    <class name="com.ssh.Student" table="student" schema="dbo" catalog="sshcourse">
        <id name="stuId" type="integer">
            <column name="stu_id" />
            <generator class="native" />
        </id>
        <property name="stuName" type="string">
            <column name="stu_name" length="50" />
        </property>
        <property name="stuPwd" type="string">
            <column name="stu_pwd" length="50" />
        </property>
        <set name="courses"
        table="course_student_table"
        cascade="save-update"
        inverse="false" 
        lazy="false">
        <key column="stu_id"></key>
        <many-to-many class="com.ssh.Course" column="cou_id"></many-to-many>
        </set>
    </class>
</hibernate-mapping>
課程Course.hbm.xml:
<hibernate-mapping>
    <class name="com.ssh.Course" table="course" schema="dbo" catalog="sshcourse">
        <id name="couId" type="integer">
            <column name="cou_id" />
            <generator class="native" />
        </id>
        <property name="couName" type="string">
            <column name="cou_name" length="50" />
        </property>
        <property name="couDis" type="string">
            <column name="cou_dis" length="50" />
        </property>
        <set name="students"
        table="course_student_table"
        cascade="save-update"
        inverse="true">
        <key column="cou_id"></key>
        <many-to-many class="com.ssh.Student" column="stu_id"></many-to-many>
        </set>
    </class>
</hibernate-mapping>
他們之間是通過course_student_table學生課程表關聯的

【jerryzl】:
cascade=true表設定級聯,即插入學生資訊同時也插入選課資訊。

【jk88811】:
Hibernate感覺挺難用的

可以我的思想還停留在關係操作上吧, 現在喜歡用Ibatis

【deitecnu】:
jerryzl() 說的比較詳細了,不過還有幾點疑問:

<set name="courses"
        table="course_student_table"
        cascade="save-update"
        inverse="false" 
        lazy="false">
        <key column="stu_id"></key>
        <many-to-many class="com.ssh.Course" column="cou_id"></many-to-many>
</set>
<set name="students"
        table="course_student_table"
        cascade="save-update"
        inverse="true">
        <key column="cou_id"></key>
        <many-to-many class="com.ssh.Student" column="stu_id"></many-to-many>
</set>

上面的inverse="false"  lazy="false"和下面的inverse="true"有什麼區別?
能否給出增加、修改、刪除的方法?
比如增加一個學生,同時增加這個學生的選課資訊
    修改一個學生,同時修改這個學生的選課資訊
    刪除一個學生,同時刪除這個學生的選課資訊
給出簡單的方法就可以了,謝謝


【jerryzl】:
inverse="false" 表示為主控方,主控方負責維護關聯關係,一般在一對多關係中,把多的一方設定為inverse="false"。lazy="false表示是延遲載入,當為true時,啟動延遲載入,如兩個關聯a,b不延遲載入時可能載入a時候,也把b載入了,但你可能沒用b,只用a了,這就造成了浪費,延遲載入時表示用到b時才載入。
窩做了一個刪除你看看。
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
CourseID courseid=(CourseID)form;

Student student=studao.findById((Integer)(request.getSession().getAttribute("stuid")));
if(courseid.getCourses().length>0)
{
for(int i=0;i<courseid.getCourses().length;i++)
{
Integer cid=new Integer(courseid.getCourses()[i]);
Course course=coudao.findById(cid);
student.getCourses().remove(course);
System.out.println("this is test1 sdfsdfg");
System.out.println(cid);
}
}
else
{
System.out.println("null");
}
                studao.delete(student);
return mapping.findForward("success");
}
我做的是當vv使用者登入時,它選擇一一科,那在資料庫中就把學生表的vv使用者刪除,同時把vv使用者的選課資訊也刪除了。道理差不多,你改改。

【deitecnu】:
多謝樓上,怎麼說也應該把分數都加給你了

【zapldy】:
在實際開發過程中,我們一般都是先建好資料庫,然後根據資料庫和需求說明來建立自己相應的POJO的,一般在建立資料庫的時候,每一張表都有自己的ID,就算是多對多關聯關係的中間表也有自己的ID,而樓上的幾位沒有考慮這一點,都是POJO類用兩端set的方法,但這種方法當中間表有自己的ID或者其他的屬性的時候是行不通的.這種兩端set方法確實好,非常省事情,但在大的專案種卻非常少見,一般都是把多對多關係分成兩個一對多的關係,即中間表我們也寫一個POJO類,然後按照一對多或者多對一的策略來關聯它們之間的關係.