首先我们来举一个很简单的例子来表示多对多的关系
因此我们只要建两个表一个是teacher表一个是student表
这两者对于彼此来捉都是多对多色形式因此这两者的实体类当中都有一个set集合来表示对方
接下来就是实体类的映射文件生成方式前面的文章有,然后要改的就是这两者的主键生成方式都是native(自动增长)
还有就是set当中有所不同
在teacher的实体映射文件当中set属性以及多对多配置
//table老师表以及学生表的第三方表关系表tea_stu 哪个为主哪个级联,
//哪个多哪个维护关系因此teacher级连而student维护关系
// <column name="tid" />在table="tea_stu"中sid已知想要知道他的老师是谁则是要根据tid
//来获取该学生所对应的老师因此<column name="tid" />里的name写tid;
<set name="students" table="tea_stu" inverse="true" cascade="all" >
<key>
<column name="tid" />
</key>
<many-to-many class="com.hlp.entity.Student" column="sid"></many-to-many>
</set>
学生实体映射文件当中set属性以及多对多配置
//table老师表以及学生表的第三方表关系表tea_stu
// <column name="sid" />当中老师是如何知道自己的学生是谁的,老师则是要根据学生id来进行查找
//因此里面的name写学生id
<set name="teachers" table="tea_stu">
<key>
<column name="sid" />
</key>
<many-to-many class="com.hlp.entity.Teacher" column="tid"></many-to-many>
</set>
多对多的增删查改
private SessionFactory factory;
private Session session;
private Transaction transaction;
@Before
public void before() {
Configuration configuration = new Configuration().configure();
factory = configuration.buildSessionFactory();
session = factory.openSession();
transaction = session.beginTransaction();
}
//@Test
public void add() {
//增
Teacher t=new Teacher("小小");
Teacher t1=new Teacher("猪猪");
Teacher t2=new Teacher("大大");
Student s=new Student("anny");
Student s1=new Student("sarry");
Student s2=new Student("hanny");
t.getStudents().add(s);
t1.getStudents().add(s1);
t2.getStudents().add(s2);
s.getTeachers().add(t);
s1.getTeachers().add(t1);
s2.getTeachers().add(t2);
session.save(t);
session.save(t1);
session.save(t2);
}
//@Test
public void Select() {
//查询
List<Teacher> teachers = session.createQuery("from Teacher").list();
for (Teacher t : teachers) {
System.out.println(t.getTname());
Set<Student> students = t.getStudents();
for (Student s : students) {
System.out.println(s.getSname());
}
}
}
//@Test
public void delete() {
//删除
Teacher teacher = session.get(Teacher.class, 5);
session.delete(teacher);
}
@Test
public void update() {
//修改老师
// Teacher teacher=session.get(Teacher.class, 6);
// teacher.setTname("多多");
//修改学生
Student student=session.get(Student.class, 6);
student.setSname("补补");
}
@After
public void after() {
transaction.commit();
session.close();
factory.close();
}
这是一个比较简单的一个关系图根据以上思维便能把一下的关系用增删改写出来
我这里只写一个增加
private SessionFactory factory;
private Session session;
private Transaction transaction;
@Before
public void before() {
Configuration configuration=new Configuration().configure();
factory = configuration.buildSessionFactory();
session = factory.openSession();
transaction = session.beginTransaction();
}
@Test
public void test() {
//先给users创建对象分别给他们赋值
Users users=new Users("admin");
Users users2=new Users("小小");
//给类型赋值
UserType uType=new UserType("管理员");
UserType uType1=new UserType("商家");
UserType uType2=new UserType("用户");
//给权限赋值
Power power=new Power("增加");
Power power1=new Power("删除");
Power power2=new Power("修改");
Power power3=new Power("查询");
Power power4=new Power("开店");
//先给第一个用户的用户类型设为管理员
users.getUserTypes().add(uType);
//根据互设在用户给该用户定义类型时,该类型也要设置它的类型之下有哪些人
uType.getUsers().add(users);
//有了该类型则要有该类型中所拥有的什么权限
uType.getPowers().add(power);
uType.getPowers().add(power1);
uType.getPowers().add(power2);
uType.getPowers().add(power3);
uType.getPowers().add(power4);
//该权限当中同时要知道该权限下针对哪些用户类型打开权限
power.getUserTypes().add(uType);
power1.getUserTypes().add(uType);
power2.getUserTypes().add(uType);
power3.getUserTypes().add(uType);
power4.getUserTypes().add(uType);
//先给第一个用户的用户类型设为商家同时也是用户
users2.getUserTypes().add(uType1);
users2.getUserTypes().add(uType2);
//根据互设在用户给该用户定义类型时,该类型也要设置它的类型之下有哪些人
uType1.getUsers().add(users2);
uType2.getUsers().add(users2);
uType1.getPowers().add(power);
uType1.getPowers().add(power4);
uType2.getPowers().add(power3);
//该权限当中同时要知道该权限下针对哪些用户类型打开权限
power.getUserTypes().add(uType1);
power3.getUserTypes().add(uType2);
power4.getUserTypes().add(uType1);
session.save(users);
session.save(users2);
session.save(uType);
session.save(uType1);
session.save(uType2);
}
@After
public void after() {
transaction.commit();
session.close();
factory.close();
}