多对多关系: 例子使用学生与课程的关系
●多对多只有双向关联。
●多对多引用的是集合对象
●需要用第三张表来维持多对多关系。
●写配置文件的时候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>
●多对多只有双向关联。
●多对多引用的是集合对象
●需要用第三张表来维持多对多关系。
●写配置文件的时候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>
解决方案 »
- spring 单例执行EntityDao报No visible constructors in class
- 类的静态变量会被序列化吗
- EJBLookup参数问题
- 利用session对用户是否登录进行过滤的方案
- Who can help me?
- struts2 拦截器 定义错误不能指向自己定义的页面
- 求助struts+hibernate中的乱码问题
- server
- 为什么jbuilder编译remote 接口cmp出错,local时却可以通过,求解?
- 路过的好心的大大,求助一下。
- 我刚学ejb,想问以下:能不能将教室的两台机器连起来,一个做ejb服务器,一个做客户端,两者通信???
- 新建了一个 J2EE的qq群[31480637]
●多对多只有双向关联。
●多对多引用的是集合对象
●需要用第三张表来维持多对多关系。
●写配置文件的时候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> ------------------
够详细啊