前面已经学习了Struts2的基础知识,可以自己搭建一个简单的Struts2项目!现在开始Hibernate!从基础开始!

1.web内容回顾

  • JavaEE三层结构(后面要看下,三层架构是怎么区分的???)
  1. web层:struts2框架
  2. service层:spring框架
  3. dao层:hibernate框架,对数据库进行CRUD操作
  • MVC思想

2.Hibernate概述

什么是Hibernate框架

应用在javaee三层结构中的dao层框架,开源轻量级(不依赖其他东西)。
    在dao层里面做数据库的crud操作,底层代码就是jdbc,对jdbc进行了封装。不需要写复杂的jdbc代码和sql语句。

什么是orm思想

object relational mapping,对象关系映射
    实体类和数据表一一对应,实体类属性和数据表字段一一映射
    不需要操作数据库,而操作表对应的实体类对象

轻量级JavaEE应用的持久层框架,是一个完全的ORM框架。(说完这句话,肯定有很多人懵圈了,下面我来一个个解释)可能只有真正看到好处后才发现。

持久化:将我们想要保存的数据保存到硬盘上,也就是我们电脑的磁盘上。为什么叫持久化呢?就是数据能够保存的很久,所以叫持久化。现在对持久化的实现过程大多通过各种关系型数据库完成。所以我们常说的,将数据保存到数据库中,其实是数据库帮我们把数据保存到硬盘中了。

持久层:既然知道了什么是持久化,那么持久化层也就应该有思路了。这里把数据库看成是内存的一部分,我们就当做将数据保存到数据库中,就相当于保存到硬盘中一样。所以在操作数据库的或者跟数据库打交道的那一层就是持久层,比如我们之前知道了三层架构,不就有专门跟数据库打交道的一层叫做持久化层吗?

ORM:Object Relational Mapping 对象关系映射,这个是一个思想,模型或者说是规范。关系数据库中的记录 映射 成为程序语言中的对象实例,然后通过操作对象,来达到操作数据库的这样一种思想。如果没有ORM思想,我们之前就是直接操作数据库中的记录字段,来达到存储数据的目的。

持久化类:通过上面解释的,持久化类就是可以将类保存到数据库中,并还可以从数据库中拿到该类,这就叫持久化类。也就是下面说到的POJO类。

POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。

使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接. 其中有一些属性及其getter setter方法的类,没有业务逻辑,

持久化对象:持久化类的实例对象,能保存到数据库中,也能从数据库中取出来。

JPA的概念:Java Persistence API java持久化API,也就是java持久化的规范,ORM就是这JPA中所定义的,它还规定了其它很多规范,JPA维护一个Persistence Context(持久化上下文),这就是这个持久化上下文来事。那些ORM框架都要依据JPA规范来设计,那么各个ORM框架也就度有这么个持久化上下文。持久化上下文大体内容:1、ORM元数据,JPA支持annotion(注解)或xml两种形式描述对象/关系映射 2、实体操作API,实现对实体对象的CRUD操作    3、查询语言,约定了面向对象的查询语言JPQL(javaPersistence Query Language)

知道了一些大概的名词解释,现在来看看hibernate在一个工程中到底处于一个什么样的地位

简要体系架构结构

简要的hibernate体系架构就如上图所示,就如我们说的那样,hibernate在Application和Database之间,所以我们使用hibernate来实现对Database的操作。

我们配置xxx.hbm.xml:目的就是为了hibernate与我们的application相关联

我们配置hibernate.cfg.xml:与数据库相关的服务,例如:用户名和密码等。还有自身hibernate的服务。

Hibernate全面解决方案体系架构

二、hibernate有什么作用?

前面知道了什么事hibernate,其实也就是知道hibernate的一些特性,很虚的东西,但是我们用它到底来做什么呢?

    1、通过hibernate,完成POJO类到数据库表的映射关系

    2、通过hibernate,只需要操作对象,hibernate就帮我们生成数据库语句去操作数据库,我们不必管下面的语句是怎么样的。

    3、大概就是上面说的这两个,就是让用户来对对象的增加、删除、修改操作,来达到对数据库表中数据的这种增删改的操作

说白了,原来操作数据库我们要使用mysql语句去操作数据库,有了hibernate,我们可以直接操作与数据库映射的对象。直接操作对象就是操作数据库。

三、使用hibernate需要导的jar包和jar包的意思?

虽然不知道jar包的里面怎么实现的,但是还是有那个好奇心,必须知道这个jar包是干什么的,不然就像个傻子一样就知道复制黏贴,我相信,学完这个hibernate,我就会知道jar包里面都有什么的。

通过xxx.hbm.xml配置文件来反应pojo类和数据库表的映射关系。(这个和我本地用的不一样,后面细说)

四、如何实现POJO类到数据库表的映射关系,xxx.hbm.xml配置文件发威了

 创建对象-关系映射文件该文件应该和实体类在同一目录下。命名规则为 实体类名.hbm.xml。因为有这个配置文件,pojo类具有操作的能力了。

下面给出我们的例子:

我们的POJO类User.java

 package bean;

 public class User {
private int id;
private String name;
private String password;
/**
* @return the id
*/
public int getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the password
*/
public String getPassword() {
return password;
}
/**
* @param password the password to set
*/
public void setPassword(String password) {
this.password = password;
} }

我们 新建的数据库是hibernate,数据表是user如下:

然后看POJO类的映射配置:User.hbm.xml, 和我们的 POJO类在同路径下。

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping><!-- //根元素 -->
<!-- 指定实体类和对应的数据表 -->
<class name="bean.User" table = "user">
<!-- <id>元素设定类中的id和表的主键id的映射 -->
<!-- name是POJO类中属性的名字,column是数据表中列的名字 -->
<id name="id" column = "id">
<!-- 下面这行是主键生成策略问题 -->
<generator class="native"></generator>
</id>
<!-- name是实体类属性的名字,column是数据表中列的名字 -->
<property name="name" column="name"></property>
<!-- 如果不写column,这默认用POJO中的属性名字 -->
<property name="password" ></property>
</class> </hibernate-mapping>

我们需要配置的是:hibernate-mapping,将POJO类与数据表一一对应。

主键生产策略:

      1、increment:主键自动增长、由hibernate来管理

             注意:如果数据库也设置了自动增长,就会发生主键冲突问题

      2、identity:由底层数据库来管理生成,不由hibernate管理

             也就是说底层数据库怎么设置的主键就怎么来

             注意:mysql、sql server可以,oracle不可以

      3、sequence:标识符生成器,就是底层数据库来管理生成,利用底层数据库提供的序列来生成标识符,不由hibernate管理

             注意:mysql不支持序列  oracle支持

      4、native:由底层数据库自己来决定使用什么策略,hibernate不管

             注意:mysql自动选择identity、oracle自动选择sequence

      5、uuid:随机生成32位不相同的字符串。

      主键分自然主键和代理主键

            1自然主键:也就是在业务中有具体意义的主键,

            2代理主键,就是上面我们说的那5种,没有任何意义,只是标识主键是唯一的。

五、hibernate的配置,hibernate.cfg.xml

有了xxx.hbm.xml这个映射文件还不够,因为hibernate需要连接数据库,那么这些操作放哪里呢,就提取出一个公用的配置文件出来,hibernate.cfg.xml就是这种公共的配置文件,加载数据库连接的信息,和将各种映射文件加载进来,其实就是抽取出来的,因为有很多映射文件,每个映射文件都需要连接数据库等操作,那么久将共同的操作提取出来形成了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.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property> <!-- 为true时,会在控制台输出sql语句,便于跟踪 -->
<property name="show_sql">true</property>
<!-- 会格式化输出sql语句 -->
<property name="format_sql">true</property>
<!-- 自动提交事务 -->
<property name="hibernate.connection.autocommit">true</property> <!-- 引入映射文件 -->
<mapping resource="bean/User.hbm.xml"/> </session-factory> </hibernate-configuration>

六、有了xxx.hbm.xml和hibernate.cfg.xml后,就能使用hibernate的功能了。

下面我们 给出test demo.

 package test;

 import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration; import bean.User; public class Test { public static void main(String args[]){
//读取配置文件
Configuration conf=new Configuration().configure();
//根据配置创建factory
SessionFactory sessionFactory = conf.buildSessionFactory();
//获得操作数据库的session对象
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
//创建对象
User user = new User();
user.setName("zhangsan");
user.setPassword("12345");
//将对象保存到数据库
session.save(user);
transaction.commit();
//关闭资源
session.close();
sessionFactory.close(); } }

运行上面结果如下:

发现在 数据表 中自动添了一行信息:下面是运行了两次

总结:

Hibernate是用来帮助我们做啥的?简而言之就是让我们不在操作mysql语句,直接用来操作POJO类。

那怎么用来操作POJO类呢?通过xxx.hbm.xml这个配置文件。将POJO类与数据表映射。操作数据库字段就是操作POJO类的属性。

怎么连接数据库呢?通过hibernate.cfg.xml  这个配置文件连接数据库,配置用户名密码等。

有了上面两个配置文件,我们就可以来使用hibernate了。

通过上面的小例子,我们大致了解了使用Hibernate的流程,接下来让我们详解Hibernate。

详解Hibernate配置文件

    Hibernate从其配置文件中读取和数据库连接有关的信息。Hibernate配置文件有两种形式,XML格式或者java属性文件(properties)格式。
    (一)java属性文件的格式创建hibernate的配置文件,默认文件名为hibernate.properties,为键值对的形式,放在src目录下:例如

hibernate.dialect=org.hibernate.dialect.MySQLDialect
                hibernate.connection.driver_class=com.mysql.jdbc.Driver
                hibernate.connection.url=jdbv:mysql://localhost:3306/hibernate
                hibernate.connection.username=root
                hibernate.connection.password=123456
                hibernate.show_sql=true

hibernate.dialect:指定数据库使用的sql方言。可以根据数据库的不同生成不同的方言,底层是通过调用一个一个类实现的。
                hibernate.connection.driver_class:指定数据库的驱动程序
                hibernate.connection.url:指定连接数据库的url
                hibernate.connection.username:指定连接数据库的用户名
                hibernate.connection.password:指定连接数据库的密码
                hibernate.show_sql:如果为true,可以在控制台打印sql语句

hbm2ddl.auto:生成表结构的策略配置,配置这个可以通过映射文件和实体类自动生成表结构
                有四个值:
                    update(最常用的取值):如果当前数据库不存在对应的数据表,那么自动创建数据表
                    如果存在对应的数据表,并且表结构和实体类属性一致,那么不做任何修改
                    如果存在对应的数据表,但是表结构和实体类属性不一致,那么会新创建与实体类属性对应的列,其他列不变

create(很少使用):无论是否存在对应的数据表,每次启动Hibernate都会重新创建对应的数据表,以前的数据会丢失

create-drop(极少使用):无论是否存在对应的数据表,每次启动Hibernate都会重新创建对应的数据表,每次运行结束删除数据表

validate(很少使用):只校验表结构是否和我们的实体类属性相同,不同就抛异常

 (二)使用xml格式的配置文件,默认文件名为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.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property> <property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<property name="hibernate.connection.autocommit">true</property> <mapping resource="bean/User.hbm.xml"/> </session-factory>
</hibernate-configuration>

两种方式的区别

            如果Hibernate的配置文件为java属性文件,那么必须通过代码来声明需要加载的映射文件
            通过Configuration的addClass(实体类名.class)来加载。

配置文件为xml文件时,可以通过<mapping>元素来指定需要加载的映射文件。

当通过Configuration的默认构造方法创建实例时,会默认查找hibernate.properties文件,如果找到就将配置信息加载到内存中。
            默认情况下,hibernate不会加载hibernate.cfg.xml文件,必须通过Configuration的configure()方法来显式加载hibernate.cfg.xml文件

Hibernate中持久化类编写规范

-必须提供无参数的默认构造方法。因为程序运行时,Hibernate会运用java的反射机制,创建实体类的实例。

-所有属性必须提供public访问控制符的set get方法

-属性应尽量使用基本数据类型的包装类型(如Integer)
            基本数据类型无法表达null值,所有基本数据类型的默认值都不是null,这样就有很大的缺陷。
            例如有一个score属性,表示学生分数,如果为0,那么是表示该学生未参加考试还是说该学生成绩为0呢?
            这时候如果用包装类型,就可以使用null来表示空值,学生未参加考试等等。

-不要用final修饰实体(将无法生成代理对象进行优化)

对象标识符

在关系数据库中,通过主键来识别记录并保证记录的唯一性。
            主键的要求:不允许为null,不能重复,不能改变

自然主键:在业务中,某个属性符合主键的三个要求,那么该属性可以作为主键。比如人的身份证就可以当作主键
            代理主键:增加一个不具备任何意义的字段,通常为ID,来作为主键

在java中,按照内存地址不同区分不同的对象。

在Hibernate中通过对象标识符(OID)来维持java对象和数据库表中对应的记录。
与表的代理主键对应,OID也是整数类型,为了保证OID的唯一性和不可变性,通常由Hibernate或者底层数据库库给OID赋值。

详解对象-关系映射文件

 Hiernate采用XML格式的文件来指定对象和关系数据之间的映射。Hibernate通过这个文件来生成各种sql语句。
命名规则为 实体类名.hbm.xml 应该和实体类放在同一目录下。 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <!--根元素,有一常用属性为package,当指定了package时,后面的类名字就可以简短,例如 package="com.cad.domain",后面class标签的name只用写User即可-->
<hibernate-mapping> <!--class标签指定类和表的对应关系,name为类名,table为表名
class标签的属性 dynamic-insert属性,默认是false,当我们执行插入语句时,会动态生成sql语句,如果我们只为某个字段赋值,其他字段为null,但是生成的sql语句还是包含其他字段,例如user有两个属性,我们只为name赋值,生成的sql语句还是 insert into user(name,password)values (?,?),而当我们将该值设置为true时,生成的sql语句会仅包含不为null的字段,生成的sql语句就是insert into user(name) values (?) class标签的属性 dynamic-update属性,默认是false,当我们执行更新语句时,会动态生成sql语句,如果我们只为某个字段更新,其他字段不变,生成的sql语句还是包含其他字段。而当我们将该值设置为true时,生成的sql语句仅包含需要更新的字段
使用上面的两个属性可以提高运行性能,但是Hibernate动态生成sql语句需要的性能很小,所以可以省略-->
<class name="com.cad.domain.User" table="user"> <!--id标签用来设定持久化类中的OID和表的主键的映射,name为持久化类中的属性,column是数据表中的主键列名
id标签的属性:length 指定列的数据长度
id标签的属性:unsaved-value 指定当主键为某个值时,当做null来处理
id标签的属性:access 也可用在<property>标签上 默认值为property,即通过相应的get set方法来访问持久化类的属性,当值为field时,表明使用反射机制直接访问类的属性,不推荐使用,破坏封装性-->
<id name="id" column="id">
<!--
generator标签用来设定主键生成策略,hibernate内置的几种主键生成策略
1.increment 适用于代理主键。由Hibernate自动以递增的方式生成主键,每次增量为1 ,会执行两个sql语句,先从表中查找出最大的id,然后加一,插入当前数据
2.identity 适用于代理主键。由底层数据库生成主键,依赖数据库的主键自增功能
3.sequence 适用于代理主键。由底层数据库的序列来生成主键,前提是数据库支持序列。(mysql不支持,oracle支持)
4.hilo 适用于代理主键。Hibernate根据hilo算法来自己生成主键。
5.native 适用于代理主键。根据底层数据库对自动生成主键的支持能力选择 identity|sequence|hilo
6.uuid 适用于代理主键。采用UUID算法生成主键。
7.assigned 适用于自然主键。由我们自己指定主键值。例如指定身份证号为主键值 -->
<generator class="native"></generator>
</id> <!--
property标签属性 name指定持久化类的属性名称
column 与类属性映射的字段名,如果没有设置,默认用类属性名作为字段名
not-null 指定属性的约束是否为非空,默认false
unique 指定属性的约束是否唯一
type 指定Hibernate映射类型。例如java类型为string,数据库类型为text,那么应该把Hibernate类型设置为Text。有一张对应的表可以查看。如果没有指定映射类型,Hibernate会使用反射机制识别属性的java类型,然后自动使用与之对应的Hibernate映射类型
-->
<property name="name" column="name"></property>
<property name="password" column="password"></property>
</class>
</hibernate-mapping>

Hibernate API详解

Configuration类

 Configuration类:用来加载默认文件路径下的配置文件(hibernate.properties)。
调用configure()方法会加载默认文件路径下的xml格式的配置文件(hibernate.cfg.xml)推荐使用。 如果配置文件在不默认文件路径下或者配置文件名不符合默认规则
可以使用
new Configuration().configure(file) 加载指定文件
new Configuration().configure(path) 加载指定路径下的文件 如果使用properties格式的配置文件,可以使用addClass(实体类名.class)方法可以加载映射文件。

SessionFactory对象

 SessionFactory对象:
SessionFactory代表数据库存储源。根据Hibernate配置文件创建对应的数据库存储源。
SessionFactory对象创建后,和Configuration对象再无关联。修改Configuration包含的配置文件信息,不会对SessionFactory有任何影响。 获取SessionFactory对象:new Configuration().configure().buildSessionFactory();
对象的缓存很大,就称为重量级对象。SessionFactory存放了Hibernate配置信息,映射元数据信息等。是重量级对象。

Session对象

 Session对象:
代表程序和数据库的会话。Session提供了操作数据库的各种方法。是轻量级对象。 获取Session对象
factory.openSession(): 获取新的Session实例。
factory.getCurrentSession():采用该方法创建的Session会取出当前线程中的Session,底层使用ThreadLocal进行存取 save()方法:把Java对象保存到数据库中。
Transaction ts=session.beginTransaction();
User u=new User();
u.setName("赵六");
u.setPassword("123456");
//将对象保存到数据库
session.save(u);
ts.commit(); update()方法:更新数据库的方法
Transaction ts=session.beginTransaction();
//先查出要修改的对象,根据主键值
User user=session.get(User.class, 1);
user.setName("jery");
//将对象更新到数据库,根据OID
session.update(user);
ts.commit(); delete()方法:删除方法
底层根据OID进行删除。有两种方式
(1)
Transaction ts=session.beginTransaction();
User user=session.get(User.class, 1);
//删除指定对象
session.delete(user);
ts.commit();
(2)
Transaction ts=session.beginTransaction();
User user=new User();
user.setId(2);
session.delete(user);
ts.commit(); load()或get()方法:从数据库查找指定对象 session.get(实体类名.class,OID);或session.load(实体类名.class,OID); load()和get()的区别
我们使用get查询时发现控制台会立马打出查询语句。
使用load查询时控制台不会打印查询语句。
get方法被调用时立刻发送sql语句到数据库进行查询。
load方法被调用时并没有查询数据库,当我们需要使用查询的对象时,才去查询,所以当我们打印对象时,才会在控制台打印sql语句。 get()的原理
程序调用get方法,Hibernate发送sql语句到数据库
数据库返回结果,Hibernate将结果封装成对象,返回对象到程序。 load()的原理
程序调用load方法,Hibernate使用代理技术,创建一个代理对象,属性只有ID值。
然后返回代理对象给程序,我们使用对象时,代理对象调用Hibernate查询数据库,初始化其他属性。 load方法,返回一个代理对象,获取其属性时,会查询数据库,每次访问属性都会查询数据库么?
答:不是。代理对象中有一个标识是否被初始化的boolean类型变量,记录是否被初始化。

查询所有对象的方法

             使用HQL语言(后面会详细介绍),HQL语言是面向对象的
Query query=session.createQuery("from User"); 第二种方式
Criteria c=session.createCriteria(User.class);
List<User> l=c.list(); 第三种方式,使用原生sql语句进行查询
SQLQuery query=session.createSQLQuery("select * from user");
List l=query.list();

Transaction对象

         封装了事务的操作。我们做增删改查等操作时,必须开启事务.
因为session是线程不安全的,这样主要是为了线程安全。保证数据的正确性。
开启事务: Transaction ts=session.beginTransaction();
提交事务:ts.commit();
回滚事务:ts.rollback();
当通过getCurrentSession获取当前线程绑定的Session时,事务关闭时,会自动把Session关闭并删除。

Query对象

         封装HQL语句的对象。

         返回一个对象的方法 query.uniqueResult();

         分页相关
query.setFirstResult(index):从第几个取
query.setMaxResults(count):指定取几行记录

 

主要参考博客:

https://blog.csdn.net/c99463904/article/details/72794787

https://www.cnblogs.com/whgk/p/6074930.html

https://www.cnblogs.com/whgk/category/910622.html-----系列

Hibernate基础一的更多相关文章

  1. hibernate基础dao类

    此文章是基于 搭建SpringMVC+Spring+Hibernate平台 功能:数据库的保存.更新.删除:sql.hql查询:分页查询:调用存储过程 创建hibernate基础dao类: BaseD ...

  2. hibernate基础(1)

    hibernate基础1.hibernate介绍与动手入门体验  问题:模型不匹配(java对象模型与数据库关系模型不匹配)  解决: 1.使用JDBC手工转换        2.使用ORM(Obje ...

  3. Hibernate.基础篇《二》. getOpenSession() 和 getCurrentSession() - 1

    Hibernate.基础篇<二>. getOpenSession() 和 getCurrentSession() - 1 说明: 在Hibernate应用中,Session接口的使用最为广 ...

  4. Hibernate.基础篇《一》.Hibernate工具类.

    Hibernate.基础篇<一>.Hibernate工具类. 话述: Hibernate.基础篇第一篇,前面是代码.后面再加理论&实践. Hibernate使用的版本是:5.x,在 ...

  5. Hibernate学习笔记2.1(Hibernate基础配置)

    Hibernate基础配置 1.<property name="hbm2ddl.auto">update</property> 在SessionFactor ...

  6. Hibernate入门1. Hibernate基础知识入门

    Hibernate入门1. Hibernate基础知识入门 20131127 前言: 之前学习过Spring框架的知识,但是不要以为自己就可以说掌握了Spring框架了.这样一个庞大的Spring架构 ...

  7. Hibernate基础学习2

    Hibernate基础学习2 测试hibernate的一级缓存,事务以及查询语句 1)Hibernate的一些相关概念 hibernate的一级缓存 1)缓存是为了提高该框架对数据库的查询速度 2)一 ...

  8. Hibernate 基础配置及常用功能(三)

    本章重点讲述Hibernate对象的三种状态以及如何配置二级缓存 有关Hibernate的三种状态如何相互转换网上都能查到,官方文档描述的也比较详细.这里主要是针对几个重点方法做代码演示. 一.状态转 ...

  9. Hibernate基础学习(五)—对象-关系映射(下)

    一.单向n-1 单向n-1关联只需从n的一端可以访问1的一端. 域模型: 从Order到Customer的多对一单向关联.Order类中定义一个Customer属性,而在Customer类不用存放Or ...

  10. Hibernate基础学习(四)—对象-关系映射(上)

    一.映射对象标识符      Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键值来识别或区分同一个表的不同记录.Hibernate使用对象标识符(OID)来建立内存中的对象和数 ...

随机推荐

  1. Nestjs学习进度-180420

    # 一.已完成:# 1.将NPM降级到4.6.1,保证Nest环境正常: 2.成功运行了示例程序:https://docs.nestjs.cn/4.6/firststeps 3.粗略看了下文档. # ...

  2. scheduleAtFixedRate 与 scheduleWithFixedDelay 的区别

    总结: scheduleAtFixedRate ,是以上一个任务开始的时间计时,period时间过去后,检测上一个任务是否执行完毕,如果上一个任务执行完毕,则当前任务立即执行,如果上一个任务没有执行完 ...

  3. springboot学习四:整合mybatis

    在application.properties加入配置 ## Mybatis 配置 mybatis.typeAliasesPackage=org.spring.springboot.domain my ...

  4. python 最大连续子数组的和

    抛出问题: 求一数组如 l = [0, 1, 2, 3, -4, 5, -6],求该数组的最大连续子数组的和 如结果为[0,1,2,3,-4,5] 的和为7 问题分析: 这个问题很简单,直接暴力法,上 ...

  5. 解决oracle11G密码过期问题

    Oracle提示错误消息ORA-28001: the password has expired,是由于Oracle11G的新特性所致, Oracle11G创建用户时缺省密码过期限制是180天(即6个月 ...

  6. 转载:Java Lock机制解读

    Java Lock机制解读 欢迎转载: https://blog.csdn.net/chengyuqiang/article/details/79181229 1.synchronized synch ...

  7. pyinstall install

    安装 pyinstall 下载地址 http://www.pyinstaller.org/downloads.html 找到支持本机python版本的pyinstall下载解压即可 pyinstall ...

  8. vue缓存页面之后的生命周期

    一:<router-view :key="key"></router-view> 没有作缓存时的状态 created :某单页面刚刚创建时候的回掉函数. m ...

  9. java面试题复习(一)

    //基础最重要,如果面试官问一个答不上一个,那有难度的都都不用问了,直接就pass了,就像我,嘿嘿. //每天最好熟记10个问题,这些问题在编程是会很厚帮助,帮你避免很多不应该出现的错误. 一.面向对 ...

  10. React State(状态)

    function FormattedDate(props){ return ( <h1>现在是{props.date}</h1> ) } class Clock extends ...