多对多关系呢 在开发中尽量少使用,因为多对多性能很低。
要创建一个多对多关系,在两个多对多关系表之间必须创建一个关联表。
例如:
Student(学生)和Course(课程)的关系就是多对多关系。在映射多对多关系时需要另外使用一个连接表(如Student_Course)。Student_Course表包含二个字段:courseID和studentID。此处它们的映射文件中使用<many-to-many>标记,
在Student的映射文件中加入以下描述信息:
<set name="courses"
table="student_course"
lazy="false"
inverse="false"
cascade="save-update">
<key column="studentID" />
<many-to-many class="Course" column="CourseID"/>
</set>
相应的Course的映射文件中加入以下:
<set name="students"
table="student_course"
lazy="false"
inverse="true"
cascade="save-update">
<key column="CourseID" />
<many-to-many class="Student" column="StudentID"/>
</set>
。。。。。。。。。。。。。。。。。。。。。
删除关联关系比较简单,直接调用对象集合的remove()方法删除不要的对象就可。例如:要从学生Bill的选课清单中删除politics和chemistry两门课,程序代码如下: //获取代表Bill的Student对象
Student stu = (Student)session.createQuery("from Student s where s.name='Bill'").uniqueResult();
Course course1 = (Course)session.createQuery("from Course c where c.name='politics'").uniqueResult();
Course course2 = (Course)session.createQuery("from Course c where c.name='chemistry'").uniqueResult();
stu.getCourse().remove(course1);//删除politics课程
stu.getCourse().remove(course2);//删除chemistry课程运行以上程序将从student_course表中删除这两条记录,但T_student和T_course表没有任何变化
*****************************************************
下面就举个例子:人和服务的多对多关系:
先创建3张表:
-- 删除表
DROP TABLE person ;
DROP TABLE server ;
CREATE TABLE person
(
pid VARCHAR(32) NOT NULL PRIMARY KEY ,
name VARCHAR(20) NOT NULL ,
age INT
) ;
CREATE TABLE server
(
sid VARCHAR(32) NOT NULL PRIMARY KEY ,
name VARCHAR(20) NOT NULL
) ;
CREATE TABLE person_server
(
pid VARCHAR(32) ,
sid VARCHAR(32) ,
FOREIGN KEY (pid) REFERENCES person(pid) ON DELETE CASCADE ,
FOREIGN KEY (sid) REFERENCES server(sid) ON DELETE CASCADE
) ;
*****************************************************************
写POJO类:
package wjr.hibernate.demo23_26.associatedNN;
import java.util.Set;
public class Person {
private String pid ;
private String name ;
private int age ;
private Set servers ;
。。。。getter和setter方法。。。
}
。。。。。。。。。。。。。。
package wjr.hibernate.demo23_26.associatedNN;
import java.util.Set;
public class Server {
private String sid ;
private String name ;
private Set persons ;
。。。。getter和setter方法。。。
}
**********************************************
映射文件:
<class name="wjr.hibernate.demo23_26.associatedNN.Person" table="person">
<id name="pid" type="java.lang.String">
<column name="pid" length="32" />
<generator class="uuid.hex"></generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" length="20" not-null="true" />
</property>
<property name="age" type="java.lang.Integer">
<column name="age" />
</property>
<set name="servers" table="person_server" cascade="all">
<key column="pid"></key>
<many-to-many class="wjr.hibernate.demo23_26.associatedNN.Server"
column="sid">
</many-to-many>
</set>
</class>
。。。。。。。。。。。。。。。。。。。。。。。。。。
<class name="wjr.hibernate.demo23_26.associatedNN.Server" table="server">
<id name="sid" type="java.lang.String">
<column name="sid" length="32" />
<generator class="uuid.hex" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="20" not-null="true" />
</property>
<set name="persons" table="person_server" cascade="all">
<key column="sid"></key>
<many-to-many class="wjr.hibernate.demo23_26.associatedNN.Person"
column="pid">
</many-to-many>
</set>
</class>
*****************************************
测试类:
package wjr.hibernate.demo23_26.associatedNN;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
public class PersonServerOperation {
private Session session;
public PersonServerOperation() {
this.session = new Configuration().configure().buildSessionFactory()
.openSession();
}
public void insert(Person per) {
this.session.save(per);
this.session.beginTransaction().commit();
}
public void insert(Server ser) {
this.session.save(ser);
this.session.beginTransaction().commit();
}
public Person queryByPid(String pid) {
Person p = null;
String hql = "FROM Person AS p WHERE p.pid=?";
Query q = this.session.createQuery(hql);
q.setString(0, pid);
List all = q.list();
if (all.size() > 0) {
p = (Person) all.get(0);
}
return p;
}
public Server queryBySid(String sid) {
Server s = null;
String hql = "FROM Server AS s WHERE s.sid=?";
Query q = this.session.createQuery(hql);
q.setString(0, sid);
List all = q.list();
if (all.size() > 0) {
s = (Server) all.get(0);
}
return s;
}
public void deleteByPid(String pid)
{
String hql = "DELETE FROM Person WHERE pid=?" ;
Query q = this.session.createQuery(hql) ;
q.setString(0,pid) ;
q.executeUpdate() ;
this.session.beginTransaction().commit() ;
}
/**
* @param args
*/
public static void main(String[] args) {
PersonServerOperation pso = new PersonServerOperation();
//基本的数据插入:
// Person person = new Person() ;
// person.setName("王江荣") ;
// person.setAge(25) ;
// person.setServers(new HashSet()) ;
//
// Server server = null ;
// server = new Server() ;
// server.setName("一年包换") ;
// person.getServers().add(server) ;
//
// server = new Server() ;
// server.setName("3年维修免费") ;
// person.getServers().add(server) ;
//
// server = new Server() ;
// server.setName("免费抽奖") ;
// person.getServers().add(server) ;
//
// server = new Server() ;
// server.setName("3日两人全国游") ;
// person.getServers().add(server) ;
//
// server = new Server() ;
// server.setName("手机话费赠送100") ;
// person.getServers().add(server) ;
//
// pso.insert(person) ;
//插入人和相关服务项目
// Server server = new Server() ;
// server.setName("异地免费维修") ;
// server.setPersons(new HashSet()) ;
// Person person = null ;
// person = new Person() ;
// person.setName("霞霞") ;
// person.setAge(22) ;
// server.getPersons().add(person) ;
//
// person = new Person() ;
// person.setName("阿牛") ;
// person.setAge(28) ;
// server.getPersons().add(person) ;
//
// person = new Person() ;
// person.setName("李小姐") ;
// person.setAge(29) ;
// server.getPersons().add(person) ;
//
// pso.insert(server) ;
//测试查询某个人享受了哪些服务:
// Person p = pso.queryByPid("402881e82084b78e012084b7918d0001");
// System.out.println(p.getName() + " --> " + p.getAge());
// System.out.println("所享受的各种服务项目:");
// Iterator iter = p.getServers().iterator();
// while (iter.hasNext()) {
// Server s = (Server) iter.next();
// System.out.println(" |- "+s.getName()) ;
// }
//测试查询某项服务都有哪些人拥有
Server s = pso.queryBySid("402881e82084bd93012084bd95c60001");
System.out.println(s.getName());
System.out.println("享受服务的相关人员名单:");
Iterator iter = s.getPersons().iterator();
while (iter.hasNext()) {
Person p = (Person) iter.next();
System.out.println(" |- "+p.getName()+" --> "+p.getAge()) ;
}
}
}