Hibernate的基础知识


ORM框架 Object References Mapping 操作对象即操作表 
三层 MVC层/表示层/视图层  业务逻辑层   数据持久层Hibernate DButils MyBatis
---------------------------------------------------------------------

1.新建Maven的项目

pom.xml文件
 <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>5.1.0.Final</version>
    </dependency>
   <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.38</version>
    </dependency>
-----------------------

----------------------------------------------

2.编写核心配置文件 默认名称 hibernate.cfg.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>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
         <property name="hibernate.connection.url">jdbc:mysql://10.10.44.12:3306/salary</property>
           <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">123456</property>           
         </sessionFactory>
</hibernate-configuration>


---------------------------------------------------------------------

3.注解的方式为主

@Entry
@Table(name="")
@Id
@Basic
@Column 标识属性和字段的特殊需求 name 
@Temporal  三个选项  Temporal.DATE Temporal.TIME Temporal.TIMESPACE
@Lob 二进制数据  属性数据类型一定要是byte[] 
@Transient 不维护 

---------------------------------------------------------------------

4.根据类去创建表 配置属性 4个选项(关键字)

<property name="hbm2ddl.auto">update</property>
create 有且只有一条数据 因为它每一次都会创建一张新表
create-drop 曾今存在过 创建表 做持久化操作 删除表
update 1.如果发现没有表 创建表 2.如果发现没有该字段 添加该字段
PS  不给给你删表/删字段
validate 检查当前的类和表是否一致 一致才会去做持久化操作 否则抛异常

---------------------------------------------------------------------

5.基础代码

 //1.解析核心配置文件
 Configuration cfg=new Configuration();
 cfg.configure(); //建表
 //2.创建session工厂
 SessionFactory sf=cfg.buildSessionFactory(); 
 //3.打开一个session
 Session s=sf.openSession();
 //4.开启事务
 s.beginTransction();
 //5.持久化操作(增删查改)

 //6.提交事务
 s.getTransaction().commit();
 //7.关闭session
 s.close();
 //8.关闭sessionFactory
 sf.close();


 ---------------------------------------------------------------------

6.主键的生成策略2种大方式 

1.JPA的规范 AUTO TABLE SEQUENCE IDENTIFY
@GeneratedValue(strategy=GenerationType.AUTO)


AUTO 根据当前的数据表自动选择 MYSQL MSSQL 自增长
                              ORACLE  hibernate_sequence的序列
TABLE 单独做一张表去存放所有的表的主键=enhanced-table
SEQUENCE ORACLE 一张表对应一个序列
IDENTIFY 只有支持自增长的数据库才能使用 MYSQL MSSQL
2.Hibernate内置
配置一起用
@GeneratedValue(generator = "uuid")
@GenericGenerator(name="uuid",strategy = "uuid")strategy表示主键生成的方式
1.assigned 自定义 手动给主键 Hibernate不管
2.UUID体系:uuid uuid2 guid uuid.hex 计算方式 网卡的MAC地址+当前的时间的毫秒数+随机数
3.自增长体系 increment(hibernate来生成的) identity(依赖于数据库本身)
4.序列体系 Oracle专用
Sequence 
seqhilo 
sequence-identity
enhanced-sequence
---------------------------------------------------------------------

7.集合映射 场合 一对多

1.集合类型来分
List
@ElementCollection(targetEntity=String.Class)
@CollectionTable(name="t_names")
@Orderby
@OrderColumn(name="orderindex")
private List<String> names;
Set

@ElementCollection(targetEntity=String.Class)
@CollectionTable(name="t_names")
private Set<String> names;

Map
@ElementCollection(targetEntity=String.Class)
@CollectionTable(name="t_names")
@MapKeyProperty(name="key")
private Map<String,String> names;
---------------------------------------------------------------------
2.数据类型来分
基本数据类型
@ElementCollection(targetEntity=基本数据类型)

嵌入式数据类型 要求: 1.实现序列化接口 

2.重写hashCode和equals方法 

3.加@Embeddable

@ElementCollection(targetEntity=嵌入式数据类型)


---------------------------------------------------------------------
3.联合主键
1.联合主键也是一个嵌入式的类 @Embeddable
2.要在你想要做联合主键的类上引入这个类 加上 @EmbeddedId




------------------------------------------------------------------------

举个栗子昂

关系映射
为什么要有关系映射?
水果超市
一对一 : 用户----购物车
一对多 : 商品分类---->商品
       用户---->地址
       用户---->订单
       商品---->评论
多对多 : 订单<---->商品  
       购物车<---->商品
------------------------------------------------------------------------
1.一对一 平级
@Entry
@Table(name="TUser")
class User
{
private int usid;


}


@Entry
@Table(name="TShopCar")
class Shopcar
{
private int carid;


@OneToOne
@JoinColumn(name="usid",nullable=false,unique=true)
private User user;
}



有关Mappedby的4个原则
1.属性 返回值类型Shopcar里面和外键关联的属性user
2.关系 mappedby(放弃维护关系) 只保存数据 不维护关系
Shopcar car=new Shopcar();
User user=new User();
user.setShopcar(car); 
3.保存数据 双向关联的时候 如果想要保存数据 必须保存维护关系哪一方
4.除了级联的保存之外 其他的级联关系不受任何影响
-----------------------------------------------------------------
2.双向一对一
@Entry
@Table(name="TUser")
class User
{
private int usid;


@OneToOne(mappedby="user",cascade=Casecade.ALL)
private Shopcar shopcar;
}


@Entry
@Table(name="TShopCar")
class Shopcar
{
private int carid;


@OneToOne(cascade=Casecade.ALL)
@JoinColumn(name="usid",nullable=false,unique=true)
private User user;
}
-------------------------------------------------------------------------
3.一对多 关系建立在一方
class Catalog{
private int cid;

@OneToMany(cascade=Cascade.ALL)
@joinColumn(name="cid") //通知hibernate 给集合中的泛型中的类添加一个外键
private Set<Product> products;
}


class Product{
private int pid;
}
---------------------------------------------------------------------
4.多对一
class Catalog{
      private int cid;
}


class Product{
      private int pid;

      @ManyToOne(cascade=Cascade.ALL)
      @joinColumn(name="cid")
      private Catalog catalog;
}


-----------------------------------------------------------------------
5.双向一对多 4.2之后 (joinColumn保持一致 主表的主键) 有外键的是子表
class Catalog{
private int cid;

@OneToMany(cascade=Cascade.ALL)
@joinColumn(name="cid")
private Set<Product>product;
}


class Product{
private int pid;

@ManyToOne(cascade=Cascade.ALL)
@joinColumn(name="cid")
private Catalog catalog;
}
---------------------------------------------------------------------
6.双向多对一 3.6的版本就有了
class Catalog{
private int cid;


@OneToMany(mappedby="catalog",cascade=Cascade.ALL)
private Set<Product>product;
}


class Product{
private int pid;


@ManyToOne(cascade=Cascade.ALL) 没有mappedby这个属性
@joinColumn(name="cid")
private Catalog catalog;
}
---------------------------------------------------------------------------
7.单向多对多 建立一张中间表
class Shopcar{

private int carid;
@ManyToMany(cascade=Cascade.ALL)
 @JoinTable(name="T_SHOPCAR_PRODUCT", 
  joinColumns=@JoinColumn(name="CARID"),
  inverseJoinColumns=@JoinColumn(name="PID"))
private List<Product> products
}


class Product{
private int pid;
}

--------------------------------------------------------------------

继承映射 3种方式

-----------------------------------------------------------------------
1.共一张表
父类
@inheritance(strategy=InheritanceType.SINGLE_TABLE)
class BaseBean
{
//主键
  private int pk;


//创建人
  priate String creator;


//创建时间
  private String creatime;


//最后修改人
  private String lastmodifier;


//最后修改时间
  private String lastmodifytime;


}


@DiscriminatorColumn(name="product")
@Entry
@Table(name="TProduct")
class product extends  BaseBean
{
  private String pname;
}


@DiscriminatorColumn(name="catalog")
@Entry
@Table(name="TCatalog")
class catalog extends  BaseBean
{
  private String cname;
}


表结构如下: 在一张表中存在多个类的数据  不会使用 
BaseBean
pk  discriminator   pname    cname creator creatime lastmodifier lastmodifytime
1   product         小米盒子        张三   2018-05-28
2   catalog                  图书类 



---------------------------------------------------------------------------
2.关系表
@inheritance(strategy=InheritanceType.JOINED)
class BaseBean
{
//主键
  private int pk;


//创建人
  priate String creator;


//创建时间
  private String creatime;


//最后修改人
  private String lastmodifier;


//最后修改时间
  private String lastmodifytime;


}




@Entry
@Table(name="TProduct")
class product extends  BaseBean
{
  private String pname;
}


@Entry
@Table(name="TCatalog")
class catalog extends  BaseBean
{
  private String cname;
}



表结构如下 JOINED uuid
BaseBean
pk   creator creatime lastmodifier lastmodifytime
1    张三    2018-10-11->TProduct
2    李四    2018-10-12 ->TCatalog
子表1:TProdcut
pname    pk
小米盒子 1
子表2:TCatalog
cname   pk
图书类  2




-----------------------------------------------------------------------------
3.各一张表 

 1.每一类都会生成一张表 包括父类 2.不想把父类生成表 将父类设置为抽象的

@inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
absoule class BaseBean
{
//主键
  private int pk;


//创建人
  priate String creator;


//创建时间
  private String creatime;


//最后修改人
  private String lastmodifier;


//最后修改时间
  private String lastmodifytime;


}




@Entry
@Table(name="TProduct")
class product extends  BaseBean
{
  private String pname;
}


@Entry
@Table(name="TCatalog")
class catalog extends  BaseBean
{
  private String cname;
}



表结构如下 
子表1:TProdcut
pk  pname  creator creatime lastmodifier lastmodifytime
1          张三    2018-10-11
2          李四    2018-10-12
子表2:TCatalog
pk cname  creator creatime lastmodifier lastmodifytime
1          张三    2018-10-11
2          李四    2018-10-12






---------------------------------
双向多对多
无级分类
复杂的多对多
组件映射
级联和抓取策略
查询1+N问题
Session中其他方法
批量操作
ORACLE中的查询的操作
HQL hibernate的查询
QBC
QBE
NAVITE SQL
乐观锁和悲观锁
缓存



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值