Hibernate(五)

具体内容
在Hibernate中多对多关联使用较多,因为根据业务的需求。
学生选课,一个学生可以选择多门课程,一门课程可以有多个学生。
例如:有如下的数据库创建脚本
DROP TABLE studentcourse ;
DROP TABLE student ;
DROP TABLE course ;
CREATE TABLE student(
sid VARCHAR(50) PRIMARY KEY NOT NULL ,
sname VARCHAR(50) NOT NULL ,
sage INT NOT NULL
) ;
CREATE TABLE course(
cid INT AUTO_INCREMENT PRIMARY KEY NOT NULL ,
cname VARCHAR(50) NOT NULL
) ;
CREATE TABLE studentcourse(
sid VARCHAR(50) ,
cid INT ,
FOREIGN KEY(sid) REFERENCES student(sid) ON DELETE CASCADE ,
FOREIGN KEY(cid) REFERENCES course(cid) ON DELETE CASCADE
) ;
建立POJO类间的关系。
Student.java:
import java.util.Set;
public class Student {
private String sid ;
private String sname ;
private int sage ;
private Set courses ;
}
Course.java:
import java.util.Set;
public class Course {
private int cid;
private String cname;
private Set students;
}
Student.hbm.xml:
<hibernate-mapping>
<class name="org.lxh.hibernate.demo12.Student" table="student"
catalog="demo">
<id name="sid" type="java.lang.String">
<column name="sid" length="50" />
<generator class="assigned"></generator>
</id>
<property name="sname" type="java.lang.String">
<column name="sname" length="50" not-null="true" />
</property>
<property name="sage" type="java.lang.Integer">
<column name="sage" not-null="true" />
</property>
<set name="courses"  Student中包含了Set集合
table="studentcourse">  多对多关系中要使用studentcourse表维护关系
<key column="sid"></key>  学生表在关系表中的外键
<many-to-many  配置多对多关系
class="org.lxh.hibernate.demo12.Course"  Set中的每个元素类型
column="cid">  与Student表在关联表中的关联字段
</many-to-many>
</set>
</class>
</hibernate-mapping>
Course.hbm.xml:
<hibernate-mapping>
<class name="org.lxh.hibernate.demo12.Course" table="course"
catalog="demo">
<id name="cid" type="java.lang.Integer">
<column name="cid" />
<generator class="native"></generator>
</id>
<property name="cname" type="java.lang.String">
<column name="cname" length="50" not-null="true" />
</property>
<set name="students" table="studentcourse">
<key column="cid"></key>
<many-to-many class="org.lxh.hibernate.demo12.Student"
column="sid">
</many-to-many>
</set>
</class>
</hibernate-mapping>
此时,就完成了多对多的配置。
测试插入:
import java.util.HashSet;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
public class TestInsert {
public static void main(String[] args) {
Session session = null;
session = new Configuration().configure().buildSessionFactory()
.openSession();
Student s1 = new Student() ;
Student s2 = new Student() ;
s1.setCourses(new HashSet()) ;
s2.setCourses(new HashSet()) ;
s1.setSid("zhangsan") ;
s1.setSage(20) ;
s1.setSname("张三") ;
s2.setSid("lisi") ;
s2.setSage(21) ;
s2.setSname("李四") ;
Course c1 = new Course() ;
c1.setStudents(new HashSet()) ;
c1.setCname("JAVA") ;
s1.getCourses().add(c1) ;
c1.getStudents().add(s1) ;
s2.getCourses().add(c1) ;
c1.getStudents().add(s2) ;
session.save(s1) ;
session.beginTransaction().commit() ;
session.close() ;
}
}
运行结果:
Hibernate: insert into demo.student (sname, sage, sid) values (?, ?, ?)
Hibernate: insert into demo.course (cname) values (?)
Hibernate: insert into studentcourse (sid, cid) values (?, ?)
此时,插入的只是第一个学生,如果现在再插入第二个学生呢?
发现课程名称变为两个了,因为对于整个程序来说,第二次插入数据的时候对于Hibernate来说课程是一个新的实体,如果是新的实体,则肯定会重新插入。
import java.util.HashSet;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
public class TestInsert3 {
public static void main(String[] args) {
Session session = null;
session = new Configuration().configure().buildSessionFactory()
.openSession();
Student s2 = new Student() ;
s2.setCourses(new HashSet()) ;
s2.setSid("zhangsan") ;
s2.setSage(22) ;
s2.setSname("张三") ;
Course c1 = (Course)session.get(Course.class, 2) ;
c1.setCname("JAVA") ;
s2.getCourses().add(c1) ;
c1.getStudents().add(s2) ;
session.save(s2) ;
session.beginTransaction().commit() ;
session.close() ;
}
}
如果此时,要求可以修改一个学生所参加的全部课程,按照之前的做法需要先查询,再修改,有没有一种更好的方法可以减少数据库的操作次数呢?容器映射技术。
4、作业
完成管理员-管理员组、管理员组-管理员组权限管理程序。
管理员表
adid 管理员id(自动增长)
account 管理员名称
pwd 管理员密码
lastlogindate 上次登陆时间
post_date 注册时间
adgid 所属的组ID

管理员组表
adgid 管理员组ID(自动增长)
name 管理员组名称
description 描述

管理员组权限表
ataid 权限ID(自动增长)
type 权限类型
description 权限名称

管理员组权限关系表
adgid 管理员组ID
ataid 管理员权限ID

数据库创建脚本:
DROP DATABASE mshop ;
CREATE DATABASE mshop ;
USE mshop ;
DROP TABLE IF EXISTS admin ;
DROP TABLE IF EXISTS admingroup ;
DROP TABLE IF EXISTS admingroupauth;
DROP TABLE IF EXISTS authenticationaction;
/*==============================================================*/
/* Table: admingroup */
/*==============================================================*/
create table admingroup
(
adgid int AUTO_INCREMENT not null primary key,
name varchar(45) default NULL,
description varchar(200) default NULL
) ;
/*==============================================================*/
/* Table: admin */
/*==============================================================*/
create table admin
(
adid int AUTO_INCREMENT not null primary key,
account varchar(45) default NULL,
pwd varchar(45) default NULL,
lastlogindate datetime default NULL,
postdate datetime default NULL,
adgid int default NULL,
foreign key(adgid) references admingroup(adgid) on delete cascade
) ;
/*==============================================================*/
/* Table: authenticationaction */
/*==============================================================*/
create table authenticationaction
(
ataid int not null AUTO_INCREMENT primary key,
type int not null default 0,
description varchar(255) default NULL
) ;
/*==============================================================*/
/* Table: admingroupauth */
/*==============================================================*/
create table admingroupauth
(
adgid int not null default 0,
ataid int not null default 0,
foreign key(adgid) references admingroup(adgid) on delete cascade ,
foreign key(ataid) references authenticationaction(ataid) on delete cascade
) ;
-- 测试数据
INSERT INTO admin (account,pwd,lastlogindate,postdate,adgid) VALUES
('admin','21232F297A57A5A743894A0E4A801FC3','2006-08-10 17:32:50','2006-07-22 14:04:23',1);
INSERT INTO admingroup (name,description) VALUES ('超级管理员',NULL);
INSERT INTO admingroupauth (adgid,ataid) VALUES
(1,1), (1,2), (1,3), (1,4), (1,5),
(1,6), (1,7), (1,8), (1,9), (1,10),
(1,11), (1,12), (1,13), (1,14), (1,15);
INSERT INTO authenticationaction (type,description) VALUES
(1,'发布商品'), (1,'商品管理'), (1,'商品群组'), (2,'评论管理'),
(2,'货架管理'), (3,'订单管理'), (4,'支付管理'), (5,'配送管理'),
(6,'会员管理'), (6,'级别管理'), (6,'地区管理'),
(7,'发布新闻'), (7,'新闻管理'), (8,'账号管理'), (8,'权限管理');
运行效果:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值