`

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,'权限管理');
运行效果:






分享到:
评论

相关推荐

    hibernate五天学习笔记(txt)

    【hibernate五天学习笔记】是一份详细的Java ORM框架Hibernate的学习资料,旨在帮助开发者深入理解和掌握Hibernate的核心概念和技术。ORM(Object-Relational Mapping)是将数据库中的关系数据与Java对象进行映射的...

    hibernate中五个核心接口

    ### Hibernate中的五个核心接口 #### 一、概述 Hibernate 是一款强大的对象关系映射(ORM)框架,它简化了 Java 应用程序与数据库之间的交互过程。通过将 Java 对象映射到数据库表中,Hibernate 提供了一种更加...

    javaee实验五 大学本科生 hibernate

    【JavaEE实验五:大学本科生Hibernate】实验主要目标在于让学生掌握Hibernate开发环境的搭建,理解ORM框架的概念,以及深入理解Hibernate映射文件和配置文件的使用。Hibernate是一个强大的ORM(对象关系映射)框架,...

    hibernate教程hibernate教程

    **五、回调与拦截** Hibernate提供了回调和拦截机制,允许在特定事件(如对象保存、更新、删除等)前后执行自定义代码。这在数据同步、日志记录或其他业务逻辑处理中非常有用。 **配置二级缓存** 配置二级缓存需要...

    Hibernate的五个核心接口介绍

    Hibernate五个核心接口介绍 Hibernate是一个基于Java的开源持久层框架,它提供了五个核心接口,分别是Configuration接口、SessionFactory接口、Session接口、Transaction接口和Query与Criteria接口。这些接口是...

    Hibernate4实战 之第五部分:Hibernate的事务和并发

    ### Hibernate4实战之第五部分:Hibernate的事务与并发 #### 一、事务基础概念 **事务(Transaction)** 是一组逻辑上紧密相连的操作集合。在数据库领域,事务具备ACID特性: - **原子性(Atomicity)**:事务内的所有...

    Hibernate-extensions 完整安装包

    五、其他功能 除了上述特性,Hibernate-Extensions还提供了其他实用功能,如批量操作支持、动态实体、多对多关联的级联操作等。批量操作可以大大提高数据库操作的效率,动态实体则允许在运行时动态创建和操作实体类...

    hibernate达内五天复习笔记.pdf

    《Hibernate达内五天复习笔记》是一份详细记录了Hibernate框架学习的资料,旨在帮助读者深入理解并掌握Hibernate这一强大的Java持久化框架。以下是笔记中的主要知识点: 1. **ORM原理**: - **对象持久化**:将...

    Hibernate的五个核心接口介绍.png

    Hibernate的五个核心接口 Configuration SessionFactory Session Transcation Query和Criteria

    hibernate annotation hibernate3

    五、查询注解 1. `@NamedQuery` 定义预编译的命名查询,提高性能,例如: ```java @NamedQuery(name="User.findAll", query="SELECT u FROM User u") ``` 2. `@Query` JPA的动态查询,可以直接在注解中编写...

    hibernate-3.2源代码

    五、对象状态与生命周期 在Hibernate中,对象有三种状态:瞬时态、持久态和脱管态。理解这些状态对于正确操作对象至关重要,例如,只有持久态对象才能参与事务。 六、缓存机制 Hibernate 3.2引入了二级缓存,通过...

    Could not roll back Hibernate transaction.doc

    五、Hibernate事务回滚机制 Hibernate的事务回滚机制是指在事务执行过程中,遇到错误或异常时,Hibernate可以自动回滚事务,以确保数据库的一致性和完整性。Hibernate的事务回滚机制可以避免数据库的一致性和完整性...

    Hibernate知识点总结

    #### 五、HQL检索 **HQL(Hibernate Query Language)**是一种面向对象的查询语言,类似于SQL,但其语法更接近面向对象的思维方式。HQL支持面向对象的查询方式,例如查询特定属性、执行聚合操作等。通过HQL,开发者...

    Hibernate Spatial 4 教程

    五、Hibernate Spatial 4 的优点 Hibernate Spatial 4 提供了对空间几何对象的数据库操作支持,包括空间查询、空间索引和空间分析等功能。它还提供了与其他 Hibernate 项目的集成支持。 六、结论 Hibernate ...

    hibernate 重点知识原创

    五、session 操作数据 通过 Session,开发者可以执行 CRUD(创建、读取、更新和删除)操作。例如,使用 `save()` 或 `saveOrUpdate()` 方法保存对象,`get()` 或 `load()` 方法获取对象,`update()` 更新对象,以及...

    hibernate实现动态SQL查询

    五、FREEMARKER解析 FREEMARKER是一款强大的模板引擎,常用于Web应用中的视图渲染。在Hibernate中,我们可以利用FREEMARKER生成动态SQL。首先,我们需要在项目中引入FREEMARKER库,然后创建模板文件(如query.ftl)...

    Hibernate4.1.11中文手册

    五、入门指南 入门指南是针对初学者准备的,它以简单易懂的方式引导读者了解Hibernate的基础知识,包括环境搭建、第一个Hibernate应用的创建、简单的数据操作等。这部分内容可以帮助新手快速上手,理解ORM的基本原理...

    Hibernate使用指南

    五、 Hibernate 的映射 Hibernate 的映射是将 Java 对象映射到关系数据库表中。Hibernate 的映射主要包括以下几个方面: * 类映射:将 Java 对象映射到关系数据库表中。 * 属性映射:将 Java 对象的属性映射到关系...

    hibernate视频

    ### 五、性能优化 #### 5.1 缓存机制 - **一级缓存**:Session级别的缓存,默认开启。 - **二级缓存**:SessionFactory级别的缓存,需要手动配置。 - **查询缓存**:针对特定查询结果的缓存。 #### 5.2 批量操作 -...

Global site tag (gtag.js) - Google Analytics