多对多关系: 例子使用学生与课程的关系
●多对多只有双向关联。
●多对多引用的是集合对象
●需要用第三张表来维持多对多关系。
●写配置文件的时候many-to-many标签要放在set标签内, <key column =””>总是和本类的主键id对应 
<column=””>总是和关联类的主键id相对应 
比如在student的配置文件内: 
<set name="courses" table="ENROLLMENTS" inverse="true"  cascade="save-update"> 
<key column="sid"/> 
<many-to-many class="Course" column="cid"> 
</many-to-many> 
</set> 
●注意:两个配置文件的cascade都设置为save-updat。 
●添加关联关系时注意:
●在多对多关系中,双方都有控制权(即双方都没有设置inverse=true)的时候,则双方都要把级联关系反映到数据库中去,引发的状况是执行了两条完全一样的sql语句,违反了数据库的主键唯一性约束, 
☆代码见下:
应用程序中:
Stu.getCourses().add(course); 
Course.getStudents().add(stu); 
解决办法有两种:
◎在上述语句中任选一条执行即可
◎在某一方的配置文件中设置inverse=”true”,然后让没有设置的一方进行操作。 
◎create table students( 
sid integer primary key, 
name varchar2(32) not null, 
sex varchar2(8), 
birthday date, 
edu varchar2(64), 
cardno varchar2(16) not null unique 
); create table courses( 
cid integer primary key, 
name varchar2(32) not null unique, 
desc varchar2(256) 
); create table enrollments( 
cid integer references courses(cid), 
sid integer references students(sid), 
constraint enrollments_pk primary key(cid, sid) 
); <hibernate-mapping package="hbn.many2many"> 
<class name="Student" table="STUDENTS"> 
<id name="sid" unsaved-value="null"> 
<generator class="native"> 
</generator> 
</id> 
<property name="name"/> 
<property name="sex"/> 
<property name="birthday"/> 
<property name="edu"/> 
<property name="cardno" unique="true" not-null="true"/> 
<set name="courses" table="ENROLLMENTS" inverse="true" cascade="save-update"> 
<key column="sid"/> 
<many-to-many class="Course" column="cid"></many-to-many> 
</set> 
</class> <class name="Course" table="COURSES"> 
<id name="cid" unsaved-value="null"> 
<generator class="native"> 
</generator> 
</id> 
<property name="name" unique="true" not-null="true"></property> 
<property name="desc"></property> 
<set name="students" table="ENROLLMENTS" cascade="save-update"> 
<key column="cid"></key> 
<many-to-many class="Student" column="sid"></many-to-many> 
</set> 
</class> 
</hibernate-mapping> 

解决方案 »

  1.   

    多对多关系:   例子使用学生与课程的关系 
    ●多对多只有双向关联。 
    ●多对多引用的是集合对象 
    ●需要用第三张表来维持多对多关系。 
    ●写配置文件的时候many-to-many标签要放在set标签内,   <key   column   =””> 总是和本类的主键id对应   
    <column=””> 总是和关联类的主键id相对应   
    比如在student的配置文件内:   
    <set name="courses"   table="ENROLLMENTS"   inverse="true"    cascade="save-update">   
    <key   column="sid"/>   
    <many-to-many   class="Course"   column="cid">   
    </many-to-many>   
    </set>   
    ●注意:两个配置文件的cascade都设置为save-updat。   
    ●添加关联关系时注意: 
    ●在多对多关系中,双方都有控制权(即双方都没有设置inverse=true)的时候,则双方都要把级联关系反映到数据库中去,引发的状况是执行了两条完全一样的sql语句,违反了数据库的主键唯一性约束,   
    ☆代码见下: 
    应用程序中: 
    Stu.getCourses().add(course);   
    Course.getStudents().add(stu);   
    解决办法有两种: 
    ◎在上述语句中任选一条执行即可 
    ◎在某一方的配置文件中设置inverse=”true”,然后让没有设置的一方进行操作。   
    ◎create   table   students(   
    sid   integer   primary   key,   
    name   varchar2(32)   not   null,   
    sex   varchar2(8),   
    birthday   date,   
    edu   varchar2(64),   
    cardno   varchar2(16)   not   null   unique   
    );   create   table   courses(   
    cid   integer   primary   key,   
    name   varchar2(32)   not   null   unique,   
    desc   varchar2(256)   
    );   create   table   enrollments(   
    cid   integer   references   courses(cid),   
    sid   integer   references   students(sid),   
    constraint   enrollments_pk   primary   key(cid,   sid)   
    );   <hibernate-mapping   package="hbn.many2many">   
    <class   name="Student"   table="STUDENTS">   
    <id   name="sid"   unsaved-value="null">   
    <generator   class="native">   
    </generator>   
    </id>   
    <property   name="name"/>   
    <property   name="sex"/>   
    <property   name="birthday"/>   
    <property   name="edu"/>   
    <property   name="cardno"   unique="true"   not-null="true"/>   
    <set   name="courses"   table="ENROLLMENTS"   inverse="true"   cascade="save-update">   
    <key   column="sid"/>   
    <many-to-many   class="Course"   column="cid"> </many-to-many>   
    </set>   
    </class>   <class   name="Course"   table="COURSES">   
    <id   name="cid"   unsaved-value="null">   
    <generator   class="native">   
    </generator>   
    </id>   
    <property   name="name"   unique="true"   not-null="true"> </property>   
    <property   name="desc"> </property>   
    <set   name="students"   table="ENROLLMENTS"   cascade="save-update">   
    <key   column="cid"> </key>   
    <many-to-many   class="Student"   column="sid"> </many-to-many>   
    </set>   
    </class>   
    </hibernate-mapping>  ------------------
    够详细啊