三、持久层框架(Hibernate)
一、Hibernate处理关系
关系主要有三种:1、多对一 2、一对多 3、多对多
1、多对一
一个Product对应一个Category,一个Category对应多个Product(一个产品对应一个类别,一个类别对应多个产品)
也就是Product和Category是多对一的关系。(多个产品对应一个类别)
1.1在数据test下创建表category_table,两个字段,id(自增),字符串格式name
其实也不用建表,因为Hibernate会自动建表。
use test;
CREATE TABLE category_ table(
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(30) ,
PRIMARY KEY (id)
) DEFAULT CHARSET=UTF8;
1.2、准备类别实体类(Category.java)
package com.demo.pojo
public class Category{
private int id;//类别id
private String name;//类别名称 //属性的getter/setter方法
public int getId(){
return id;
}
public void setId(int id){
this.id=id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
}
1.3、准备类别实体类的映射xml(Category.hbm.xml)
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.demo.pojo">
<class name="Category" table="category_table">
<id name="id" column="id">
<generator class="native">
</generator>
</id>
<property name="name" />
</class> </hibernate-mapping>
1.4、为产品实体类(Product.java)增加Category属性
package com.how2java.pojo;
public class Product {
int id;
String name;
float price;
//增加Category的属性
Category category;
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
} public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
} }
1.5、为产品映射xml文件(Product.hbm.xml)设置Category多对一关系
<many-to-one name="category" class="Category" column="cid" />
使用many-to-one标签设置多对一关系,name="category",对应Product类中的category属性
class="Category"表示对应Category类,column="cid"表示指向category_table的外键。
具体配置xml如下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.how2java.pojo">
<class name="Product" table="product_table">
<id name="id" column="id">
<generator class="native">
</generator>
</id> <property name="name" />
<property name="price" />
<many-to-one name="category" class="Category" column="cid" />
</class> </hibernate-mapping>
1.6、在hibernate.cfg.xml中增加Category的映射文件
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration> <session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/test?characterEncoding=GBK</property>
<property name="connection.username">root</property>
<property name="connection.password">admin</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="current_session_context_class">thread</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<!--Product实体类的映射文件-->
<mapping resource="com/demo/pojo/Product.hbm.xml" />
<!--Category实体类的映射文件-->
<mapping resource="com/demo/pojo/Category.hbm.xml" />
</session-factory> </hibernate-configuration>
1.7测试many-to-one多对一关系
package com.demo.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; import com.demo.pojo.Product;
public class TestHibernate{
public static void main(String[] args){
SessionFactory sf=new Configuration().configure().buildSessionFactory();
Session session=sf.opneSession();
session.beginTransaction(); Category category=new Category();
category.setName("car");
session.save(category); Product product=(Product)s.get(Product.clas,5);//获取id=5的产品
product.setCategory(category);//把类别设置到产品的实体类中
session.update(p); session.getTransaction().commint();
session.close();
sf.close();
}
}
2、一对多
Category和Product是一对多关系(一个Category对应多个Product)
2.1、给Category实体类增加一个Set集合(无序的Product)
package com.demo.pojo
import java.util.Set;
public class Category{
private int id;//类别id
private String name;//类别名称 //属性的getter/setter方法
public int getId(){
return id;
}
public void setId(int id){
this.id=id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
} //设置Product的Set
Set<Product> products;
public Set<Product> getProducts(){
return products;
}
public void SetProducts(Set<Product> products){
this.products=products;
}
}
2.2、给Category.hbm.xml增加one-to-many映射
<set name="products" lazy="false">
<key column="cid" not-null="false"/>
<ont-to-many class="Product"/>
</set>
set标签用于设置一对多关系,也可以设置多对多。
name="products"对应Category类中的products属性,lazy="false",表示不使用延迟加载
<key colum="cid" not-null="false"/>表示外键是cid,可以为空
<one-to-many class="Product"/>表示一对多对应的类是Product
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.demo.pojo">
<class name="Category" table="category_table">
<id name="id" column="id">
<generator class="native">
</generator>
</id>
<property name="name" /> <!--set标签设置一对多关系-->
<set name="products" lazy="false">
<key column="cid" not-null="false" />
<one-to-many class="Product" />
</set>
</class>
</hibernate-mapping>
2.3、测试one-to-many关系
首先获取id=i的category,然后通过getProducts()获取所对应的所有的product
package com.demo.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; import com.demo.pojo.Product;
public class TestHibernate{
public static void main(String[] args){
SessionFactory sf=new Configuration().configure().buildSessionFactory();
Session session=sf.opneSession();
session.beginTransaction(); Category category=new Category();
category.setName("car");
session.save(category); Category category=(Category)session.get(Category.class,1);//获取id=1的类别
Set<Product> set=c.getProducts();//获取产品的集合
for(Product p:set){//遍历产品集合
System.out.println(p.getName());
}
session.getTransaction().commint();
session.close();
sf.close();
}
}
3、多对多
一种product可以被多个User购买,一个User可以购买多种Product
所以Product和User之间关系是多对多many-to-many
要实现多对多关系,必须要有一张中间表,user_product用于维护User和Product之间的关系
3.1、User的实体类(User.java)
增加Product集合
package com.demo.pojo;
import java.util.Set;
public class User{
private int id;//用户id
private String name;//用户名
Set<Product> products;//产品 //属性的getter/setter方法
public int getId(){
return id;
}
public void setId(int id){
this.id=id;
}
public int getName(){
return name;
}
public void setName(String name){
this.name=name;
}
//设置Product的Set
public Set<Product> getProducts(){
return products;
}
public void setProducts(Set<Product> products){
this.products=products;
}
}
3.2、User.hbm.xml映射文件xml的编写
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.demo.pojo">
<class name="User" table="user_table">
<id name="id" column="id">
<generator class="native">
</generator>
</id>
<property name="name" />
<!--多对多的设置-->
<set name="products" table="user_product" lazy="false">
<key column="uid" />
<many-to-many column="pid" class="Product" />
</set>
</class>
</hibernate-mapping>
3.3、Product的实体类(Product.java)
增加User的集合
package com.demo.pojo;
import java.util.Set;
public class Product{
private int id;
private String name;
private float price; Category category;//一对多 Set<User> users;//多对多 //属性的getter/setter方法
public int getId(){
return id;
}
public void setId(int id){
this.id=id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public float getPrice(){
return price;
}
public void setPrice(float price){
this.price=price;
} //Category
public Category getCategory(){
return category;
}
public void setCategory(Category category){
this.category=category;
}
//Set<User>
public Set<User> getUser(){
return users;
}
public vodi setUser(Set<User> users){
this.users=users;
}
}
3.4、Product的映射文件配置(Product.hbm.xml)
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.demo.pojo">
<class name="Product" table="product_table">
<id name="id" column="id">
<generator class="native">
</generator>
</id>
<property name="name" />
<property name="price" />
<!--多对一-->
<many-to-one name="category" class="Category" column="cid" />
<!-- 多对多-->
<set name="users" table="user_product" lazy="false">
<key column="pid" />
<many-to-many column="uid" class="User" />
</set>
</class>
</hibernate-mapping>
3.5、在hibernate.cfg.xml中增加User.hbm.xml的映射
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/test?characterEncoding=GBK</property>
<property name="connection.username">root</property>
<property name="connection.password">admin</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="current_session_context_class">thread</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<!--映射文件的配置-->
<mapping resource="com/demo/pojo/Product.hbm.xml" />
<mapping resource="com/demo/pojo/Category.hbm.xml" />
<mapping resource="com/demo/pojo/User.hbm.xml" />
</session-factory> </hibernate-configuration>
3.6、测试多对多many-to-many关系
package com.demo.test; import java.util.HashSet;
import java.util.Set; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; import com.demo.pojo.Product;
import com.demo.pojo.User; public class TestHibernate{
public static void main(String[] args){
SessionFactory sf=new Configuration().configure().buildSessionFactory();
Session session=sf.opneSession();
session.beginTransaction();
//增加3个用户
Set<User> users=new HashSet();
for(int i=0;i<3;i++){
User u=new User();
u.setName("user"+i);
users.add(u);
s.save(u);
}
//id=1产品被用户1,2,3购买
Product product=(Product)session.get(Product.class,1);
product.setUsers(users);
s.save(product); session.getTransaction().commint();
session.close();
sf.close();
}
}
三、持久层框架(Hibernate)的更多相关文章
- 菜鸟学习Hibernate——持久层框架
一.Java操作数据库的阶段. Java对数据库进行操作经历了三个阶段. 1.1操作JDBC阶段 这个阶段就是利用JDBC类来操作数据库.这个阶段出现了两个问题: 代码过度重复:在每一次数据库操作的是 ...
- Hibernate数据库持久层框架
Hibernate是一种Java语言下的对象关系映射解决方案. 它是使用GNU宽通用公共许可证发行的自由.开源的软件.它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架.Hib ...
- Java数据持久层框架 MyBatis之背景知识三
摘录自:http://www.cnblogs.com/lcngu/p/5437281.html 对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.or ...
- Hibernate: 数据持久层框架
Hibernate 是一种Java语言下的对象关系映射解决方案. 它是使用GNU宽通用公共许可证发行的自由.开源的软件.它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架.Hi ...
- Mybatis学习之自定义持久层框架(三) 自定义持久层框架:读取并解析配置文件
前言 前两篇文章分别讲解了JDBC和Mybatis的基本知识,以及自定义持久层框架的设计思路,从这篇文章开始,我们正式来实现一个持久层框架. 新建一个项目 首先我们新建一个maven项目,将其命名为I ...
- MyBatis持久层框架使用总结
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis . 2 ...
- .NET平台下,关于数据持久层框架
在.NET平台下,关于数据持久层框架非常多,本文主要对如下几种做简要的介绍并推荐一些学习的资源: 1.NHibernate 2.NBear 3.Castle ActiveRecord 4.iBATIS ...
- 持久层框架之MyBatis
1.mybatis框架介绍: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并 ...
- MyBatis持久层框架学习之01 MyBatis的起源和发展
一.MyBatis的简介 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. MyB ...
- MyBatis持久层框架使用总结 转载
MyBatis持久层框架使用总结 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google co ...
随机推荐
- Codeforces Round #107 (Div. 1) B. Quantity of Strings(推算)
http://codeforces.com/problemset/problem/150/B 题意: 给出n,m,k,n表示字符串的长度为n,m表示字符种类个数,k表示每k个数都必须是回文串,求满足要 ...
- ORACLE SYNONYM详解
以下内容整理自Oracle 官方文档 一 概念 A synonym is an alias for any table, view,materialized view, sequence, proce ...
- 快排+java实现
import java.util.Arrays; public class QuickSort { //三数取中法.取出不大不小的那个位置 public static int getPivotPos( ...
- SQL Server DATEADD() 函数及实际项目应用注意事项
1. DATEADD() 函数的解释和语法分析 DATEADD() 函数在日期中添加或减去指定的时间间隔. 语法: DATEADD(datepart,number,date) date 参数是合法的日 ...
- EndNote基础教程
endnote的使用方法 http://www.360doc.com/content/17/1211/08/31841004_711998509.shtml 导入文献 File-Import-Flod ...
- C#_Demo_摄像头实时_4线程人脸识别注册开发全过程
v效率有点低,大家看看哪里开可以节省时间?源代码:https://github.com/catzhou2002/ArcFaceDemo说实话,为了提高识别效率,我也是竭尽所能,干了不少自认为的优化,如 ...
- icehouse版本中常用操作命令
•Glance操作常用命令1,列出所有镜像.glance image-list 2,显示某个image的详细信息.glance image-show 某个image的ID. 3,获得命令的帮助.gla ...
- Error updating database:线程异常
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".SLF4J: See http://www.slf4 ...
- Python 常见时间处理
Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能. Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间. 时间间隔是以秒为单位的浮点小数. ...
- C#内存压缩zip文件
C#中我们使用比较多的文件压缩第三方DLL就是Ionic.Utils.Zip.dll.但是这个DLL只支持对现有文件进行压缩,而不支持内存压缩,如果需要使用内存压缩,那么有第三方DLL ICSharp ...