`

hibernate笔记

阅读更多

=================================

Hibernate
=================================

为什么使用 HIbernate?
------------------------------
* 封装繁琐的jdbc操作
* O-R Mapping 框架
Object-Relation 对象关系映射

hibernate 配置文件
------------------------------
* 映射配置文件

类名.hbm.xml

配置:
1. 类-表 对应关系
2. 属性-字段 对应关系

* hibernate.cfg.xml

1. 配置 jdbc 连接信息
2. 加载的映射配置文件

hibernate 配置步骤
------------------------------------
1. 数据库表
2. 创建封装数据的对象
3. 映射关系配置
4. hibernate.cfg.xml

1.
------------------
drop database if exists hibernate_test;
create database hibernate_test
default character set utf8;
use hibernate_test;

drop table if exists t_xuesheng;
create table t_xuesheng(
id int primary key auto_increment,
name varchar(16),
gender char(1),
birthday date,
is_graduate int(1)
)engine=innodb default character set utf8;

2.
------------------
test.xuesheng.entity.Xuesheng
添加属性:
private int id;
private String name;
private String gender;
private java.util.Date birthday;
private boolean isGraduate;

构造方法:
无参构造
全参构造

3.
------------------
映射配置文件,
配置文件格式参考文档 1.2.2 节

4.
------------------
src\hibernate.cfg.xml

配置 driver、url、username、password
(项目中引入mysql驱动jar文件)

配置文件格式参考文档 1.2.3 节



hibernate 数据存取 API
------------------------------------
Configuration
读取 hibernate.cfg.xml,
并创建 SessionFactory

SessionFactory
* 帮助创建数据库连接
* 可类比为 jdbc 的 DriverManager

Session
* 数据库连接
* 可类比为 jdbc 的 Connection
* 含有所有数据存取 API

Session 存取数据的方法
--------------------------
get(类型, 主键值)
根据主键值查询
* 若主键值不存在,会得到null

load(类型, 主键值)
根据主键值查询
* 延迟加载
* 若主键值不存在,会出现异常

load 方法中,使用CGLIB工具包(字节码增强工具)
动态生成了一个 Xuesheng 的子类:  Xuesheng$$EnhancerByCGLIB$$a92a015c
在这个类中,重写了 get非主键属性() 方法:
判断属性是否查询过,
若没有查询过,此时做查询

延迟查询、延迟加载
数据不使用不查询,知道使用时才查询
最大限度的减少 sql 执行

load(空的实体对象, 主键值)
根据主键值查询,
查询结果,放入给定的实体对象

save(实体对象)
insert into

除了 insert 数据,
还会从数据库取出刚刚生成的 id 值放入实体对象
mysql: select last_insert_id()

update(实体对象)
根据主键,修改一条数据

实体对象内,要含有存在的主键值
若主键值不存在,会出现异常

delete(实体对象)
根据主键值删除

实体对象内,要含有存在的主键值
若主键值不存在,会出现异常

saveOrUpdate(实体对象)
判断实体对象内是否有主键值

如果没有,save()
如果有,update() 若主键不存在,会出现异常


Session 一级缓存特性及 API
-------------------------------------
查询的数据会在 Session 内进行缓存
缓存结果,可以提高效率

* Session 内缓存的对象存在副本
* commit 时,会比较session缓存内对象与其副本对象是否一致,
若不一致,执行 update()
* 允许清除副本对象
session.setReadOnly(实体对象, true)


一级缓存控制 API
------------------------------
* 缓存内不能关联两个相同主键值的对象
* 解决方式:
1.清除缓存内对象
2.将数据复制到缓存的对象中

session.evict(已缓存的实体对象)
清除缓存内对象

session.clear()
清空缓存

commit 时对 sql 语句的优化
------------------------------
* hibernate 内部算法会判断所有 sql 优先级,
甚至可以忽略不必要的sql

session.flush()

* 如果不希望操作顺序被 hibernate 改变
   或不希望 hibernate 忽略操作
   执行 flush()
   刷出之前的所有操作
  
  
  
session 特殊 API 小结
------------------------------
session.setReadOnly(实体对象, true) - 移除副本

session.evict(已缓存的实体对象) - 移除指定对象的缓存
session.clear() - 清空缓存

session.flush() - 刷出操作


主键生成方式 5.1.4.1 节
----------------------------------
identity:
自增主键

sequence:
oracle sequence
<generator class="sequence" >
<param name="sequence">sequence名称</param>
</generator>

assigned:
手动赋值

native:
identity, sequence 或者hilo
如果mysql,identity
如果oracle,要配置<param name="sequence">sequence名称</param>
其他,hilo随机生成

uuid.hex:
32个16进制字符

foreign:
one-to-one 中使用

increment:
查询 id 的最大值,加一生成新的主键值
线程安全有问题



数据类型 5.2.2 节
----------------------------------
1. java对象类型
java.lang.Integer
java.lang.String
java.lang.Double
java.sql.Date
java.sql.Time
java.sql.Timestamp

2. 基本类型
int
double

3. hibernate 的类型别名
string
integer
double
date
time
timestamp


HQL - Hibernate Query Language
------------------------------------------
面向对象的 SQL

示例:
* select name, isGraduate from test.hibernate.xuesheng.Xuesheng
返回集合, 集合内是 Object[] 数组

* from Xuesheng
* from Xuesheng where name like '%zhang%'

* from Xuesheng x
where x.name like '%zhang%'
and x.isGraduate=false

* select new Xuesheng(x.name,x.isGraduate)
from Xuesheng x
学生类内必须存在相应的构造方法

* select x
from
Xuesheng x,
Banji b
where
x.banjiId=b.id

* 关联关系映射查询
* from Xuesheng where banji.id=?
* select banji from Xuesheng where name=?

* from Xuesheng x join fetch x.banji
fetch: 将 banji 抓到学生对象内








执行 HQL API
----------------------------------
1. Query q = session.createQuery("...where name=?, gender=:g")
2. q.setParameter(0, 数据类型自动辨别)
q.setString(1, "ffff")
q.setInteger(2, 3453)
q.setDouble(3, 3.14)
q.setParameterList(占位符名, 数组或集合)
3. 获得查询结果
a. q.list()
b. q.uniqueResult()

========================================================
========================================================

Log4j
-------------------------------------
输出调试信息
替代 System.out.println()

日志信息级别:
debug info warn error fatal

日志输出位置:
Appender
控制台
文件

名字空间:
test.hibernate.xuesheng.DEBUG_MESSAGE
debug:"hello"
warn: "1111"
error: "2222"

test.hibernate.Test1
"world"

log4j.rootLogger=所有名字空间的通配,配置输出级别和位置
log4j.logger.test.hibernate.xuesheng.DEBUG_MESSAGE=warn
log4j.logger.test.hibernate=off


hibernate 的 log4j 名字空间:
-----------------------------------------
输出 sql 语句
log4j.logger.org.hibernate.SQL=debug

输出事务信息
log4j.logger.org.hibernate.transaction=debug

输出二级缓存信息
log4j.logger.org.hibernate.cache=debug



hibernate 关联映射 (映射外键关系)
----------------------------------------------
一对多 | 多对一
--------------------------------------------
<many-to-one name="banji"
  column="banji_id"
  class="test.xuesheng.entity.Banji"
   />
lazy="false" 查询学生的同时,也立即查询学生关联的班级
fetch="join"   可用表连接的方式同时查询两张表的数据
  
* 绝大多数情况下都应该采用延迟加载

<bag name="xueshengList">
<key column="banji_id" />
<one-to-many
class="test.xuesheng.entity.Xuesheng" />
</bag>

一对一
--------------------------------------------
1. 主键关联

drop table if exists t_lianxi;
create table t_lianxi(
xuesheng_id int primary key,
email varchar(255),
qq varchar(20),
mobile varchar(20),
foreign key(xuesheng_id)
references t_xuesheng(id)
)engine=innodb default character set utf8;

* 创建 Lianxi 类
* 创建 Lianxi.hbm.xml 映射配置文件
* 主键生成方式: assigned
* hibernate.cfg.xml 中添加一行<mapping ...

<one-to-one name="" class="" />

2. 具有唯一约束的外键字段关联

alter table t_user add(
xuesheng_id int unique,
foreign key(xuesheng_id)
references t_xuesheng(id)
);

User 设置:
--------------------------
<many-to-one name="xuesheng"
   column="xuesheng_id"
   class="Xuesheng"
   unique="true"
    />

通过 unique="true" 设置为一对一关系

Xueshkeng 设置:    
--------------------------
<one-to-one name="user"
class="User"
property-ref="xuesheng"
  />
 
通过property-ref="xuesheng"设置,
hibernate 可以知道:
学生表主键 id,关联 user 中 xuesheng_id


多对多
--------------------------------------------
drop table if exists t_kecheng;
create table t_kecheng(
id char(32) primary key,
name varchar(32)
)engine=innodb default character set utf8;

drop table if exists t_xs_kc_link;
create table t_xs_kc_link(
xs_id int,
kc_id char(32),
primary key(xs_id,kc_id),
foreign key(xs_id)
references t_xuesheng(id),
foreign key(kc_id)
references t_kecheng(id)
)engine=innodb default character set utf8;

* 创建 Kecheng 类
* 创建 Kecheng.hbm.xml
* 主键生成方式: uuid.hex
* 修改 hibernate.cfg.xml 添加一条 <mapping...

<set name="kechengSet" table="t_xs_kc_link">
<key column="xs_id" />
<many-to-many
column="kc_id"
class="Kecheng"  />
</set>




关联关系4个属性
-----------------------------------
lazy
-many: true|false
-one: proxy|false

fetch
select|join
立即加载时,设置为join,减少 sql 语句

inverse
true
放弃外键字段控制权,控制权交给对方

* 通常在“一方”设置

cascade
all|delete|save-update|delete-orphan

* delete-orphan 只能在 one-to-many 中使用
* 通常从“一方”向“多方”级联



hibernate 组件映射
----------------------------------------------
drop table if exists t_user;
create table t_user(
id int primary key,
username varchar(32),
password varchar(32),
street varchar(255),
city varchar(32),
country varchar(32)
)engine=innodb default character set utf8;

* 创建 Address 类
属性: street,city,contry
* 创建 User 类
属性: id,username,password,address
* 创建 User.hbm.xml
* 主键生成方式: increment
* 修改 hibernate.cfg.xml 添加 <mapping...

<component name="address">
<property ...
</component>




hibernate 继承映射
----------------------------------------------
1. 单表 -》 类继承结构
-----------------------------------
drop table if exists t_product;
create table t_product(
id int primary key auto_increment,
name varchar(64),
price numeric(8,2),
amount int,
type varchar(16),

author varchar(255),
pages int,

singer varchar(32),
style varchar(32)
)engine=innodb default character set utf8;




多个框架中 jar 文件版本冲突
------------------------------------------
XML11....
----------------------

hibernate
xerces-x.x.x.jar
tomcat 中也有这个 jar 文件,版本不一致

移除 hibernate 中携带的 jar 文件
window->preferences->检索 hibernate
->找到 myeclipse/project capabilities/hibernate
->hibernate 3.1、3.2、3.3
->找到xerces-x.x.x.jar,移除

如果要恢复,右下角点 restore default

antlr... 方法找不到
-----------------------------
hibernate
antlr-2.7.6rc1.jar
struts2
antlr-2.7.2.jar

移除 struts2 的低版本 jar 文件
分享到:
评论

相关推荐

    少儿编程scratch项目源代码文件案例素材-绝地求生.zip

    少儿编程scratch项目源代码文件案例素材-绝地求生.zip

    嵌入式八股文面试题库资料知识宝典-文思创新面试题2010-04-08.zip

    嵌入式八股文面试题库资料知识宝典-文思创新面试题2010-04-08.zip

    一种基于剪切波和特征信息检测的太阳斑点图融合算法.pdf

    一种基于剪切波和特征信息检测的太阳斑点图融合算法.pdf

    并联型APF有源电力滤波器Matlab Simulink仿真:dq与αβ坐标系下的谐波无功检测与PI控制及SVPWM调制

    内容概要:本文详细介绍了并联型有源电力滤波器(APF)在Matlab/Simulink环境下的仿真研究。主要内容涵盖三个关键技术点:一是dq与αβ坐标系下的谐波和无功检测,利用dq变换和FBD技术实现实时检测;二是两相旋转坐标系(dq)与两相静止坐标系(αβ)下的PI控制,通过调整比例和积分环节实现精准控制;三是SVPWM调制方式的应用,通过优化开关时序提升系统效率和性能。文中还提供了详细的仿真介绍文档,包括模型搭建、参数设定以及结果分析。 适合人群:从事电力电子、自动化控制领域的研究人员和技术人员,尤其是对电力滤波器仿真感兴趣的读者。 使用场景及目标:适用于需要深入了解并联型APF工作原理和实现方式的研究人员,旨在通过仿真工具掌握谐波和无功检测、PI控制及SVPWM调制的具体应用。 其他说明:本文不仅提供了理论知识,还结合了实际操作步骤,使读者能够通过仿真模型加深对APF的理解。

    Arduino KEY实验例程【正点原子ESP32S3】

    Arduino KEY实验例程,开发板:正点原子EPS32S3,本人主页有详细实验说明可供参考。

    嵌入式八股文面试题库资料知识宝典-嵌入式C语言面试题汇总(66页带答案).zip

    嵌入式八股文面试题库资料知识宝典-嵌入式C语言面试题汇总(66页带答案).zip

    .archivetempdebug.zip

    .archivetempdebug.zip

    嵌入式系统开发_CH551单片机_USB_HID复合设备模拟_基于CH551单片机的USB键盘鼠标复合设备模拟器项目_用于通过CH551微控制器模拟USB键盘和鼠标输入设备_实现硬.zip

    嵌入式系统开发_CH551单片机_USB_HID复合设备模拟_基于CH551单片机的USB键盘鼠标复合设备模拟器项目_用于通过CH551微控制器模拟USB键盘和鼠标输入设备_实现硬

    少儿编程scratch项目源代码文件案例素材-剑客冲刺.zip

    少儿编程scratch项目源代码文件案例素材-剑客冲刺.zip

    少儿编程scratch项目源代码文件案例素材-火影.zip

    少儿编程scratch项目源代码文件案例素材-火影.zip

    两极式单相光伏并网系统的Boost电路与桥式逆变仿真及优化方法

    内容概要:本文详细介绍了两极式单相光伏并网系统的组成及其仿真优化方法。前级采用Boost电路结合扰动观察法(P&O)进行最大功率点跟踪(MPPT),将光伏板输出电压提升至并网所需水平;后级利用全桥逆变加L型滤波以及电压外环电流内环控制,确保并网电流与电网电压同频同相,实现高效稳定的并网传输。文中还提供了具体的仿真技巧,如开关频率设置、L滤波参数计算和并网瞬间软启动等,最终实现了98.2%的系统效率和低于0.39%的总谐波失真率(THD)。 适合人群:从事光伏并网系统研究、设计和开发的技术人员,特别是对Boost电路、MPPT算法、逆变技术和双环控制系统感兴趣的工程师。 使用场景及目标:适用于希望深入了解两极式单相光伏并网系统的工作原理和技术细节的研究人员和工程师。目标是在实际项目中应用这些理论和技术,提高光伏并网系统的效率和稳定性。 其他说明:文中提供的仿真技巧和伪代码有助于读者更好地理解和实现相关算法,在实践中不断优化系统性能。同时,注意电网电压跌落时快速切换到孤岛模式的需求,确保系统的安全性和可靠性。

    昭通乡镇边界,矢量边界,shp格式

    矢量边界,行政区域边界,精确到乡镇街道,可直接导入arcgis使用

    嵌入式八股文面试题库资料知识宝典-嵌入式c面试.zip

    嵌入式八股文面试题库资料知识宝典-嵌入式c面试.zip

    嵌入式八股文面试题库资料知识宝典-I2C总线.zip

    嵌入式八股文面试题库资料知识宝典-I2C总线.zip

    岩土工程中随机裂隙网络注浆模型及其应用:不同压力下注浆效果的研究

    内容概要:本文详细介绍了三种注浆模型——随机裂隙网络注浆模型、基于两相达西定律的注浆模型、基于层流和水平集的注浆扩散模型。首先,随机裂隙网络注浆模型基于地质学原理,模拟裂隙网络发育的实际地质情况,在不同注浆压力下进行注浆作业,以增强地基稳定性和提高承载能力。其次,基于两相达西定律的注浆模型利用数学公式模拟裂隙网络中的流体输送过程,适用于裂隙网络地质条件下的注浆效果分析。最后,基于层流和水平集的注浆扩散模型通过引入层流特性和水平集方法,更准确地模拟注浆过程中的扩散过程。文中还讨论了不同注浆压力对注浆效果的影响,并提出了优化建议。 适合人群:从事岩土工程、地基加固等相关领域的工程师和技术人员。 使用场景及目标:①帮助工程师选择合适的注浆模型和注浆压力;②为实际工程项目提供理论支持和技术指导;③提升地基加固的效果和效率。 其他说明:文章强调了在实际应用中需要结合地质条件、裂隙网络特点等因素进行综合分析,以达到最佳注浆效果。同时,鼓励不断创新注浆工艺和方法,以满足日益增长的地基加固需求。

    COMSOL Multiphysics 5.5与6.0版本Ar棒板粗通道流注放电仿真的电子特性分析

    内容概要:本文详细比较了COMSOL Multiphysics软件5.5和6.0版本在模拟Ar棒板粗通道流注放电现象方面的异同。重点探讨了不同版本在处理电子密度、电子温度、电场强度以及三维视图等方面的优缺点。文中不仅介绍了各版本特有的操作方式和技术特点,还提供了具体的代码实例来展示如何进行精确的仿真设置。此外,文章还讨论了网格划分、三维数据提取和电场强度后处理等方面的技术难点及其解决方案。 适合人群:从事等离子体物理研究的专业人士,尤其是熟悉COMSOL Multiphysics软件并希望深入了解其最新特性的研究人员。 使用场景及目标:帮助用户选择合适的COMSOL版本进行高效、精确的等离子体仿真研究,特别是在处理复杂的Ar棒板粗通道流注放电现象时提供指导。 其他说明:文章强调了在实际应用中,选择COMSOL版本不仅要考虑便捷性和视觉效果,还需兼顾仿真精度和可控性。

    嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_8.doc.zip

    嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_8.doc.zip

    通信系统中波形优化与捷变频、PRT抗干扰技术及ISRJ联合优化的应用研究

    内容概要:本文详细介绍了在现代通信系统中,抗干扰技术的重要性和具体应用方法。首先阐述了抗干扰技术的背景及其重要性,随后分别讨论了捷变频技术和波形优化技术的具体机制和优势。捷变频技术能快速改变工作频率,防止被干扰源锁定;波形优化技术则通过改进信号波形来提升抗干扰性能。接着,文章探讨了两种技术相结合的协同效应,最后重点介绍了发射信号及接收滤波器联合优化的抗干扰策略(ISRJ),这是一种综合性优化手段,旨在最大化抗干扰效果并提高通信质量。 适合人群:从事通信工程及相关领域的研究人员和技术人员,尤其是关注抗干扰技术的专业人士。 使用场景及目标:适用于需要提升通信系统稳定性和可靠性的场合,如军事通信、卫星通信等领域。目标是帮助技术人员理解和掌握先进的抗干扰技术,应用于实际项目中。 其他说明:文中提到的技术不仅限于理论层面,还涉及具体的实施细节和应用场景,有助于读者深入理解并应用于实践中。

    少儿编程scratch项目源代码文件案例素材-吉他英雄.zip

    少儿编程scratch项目源代码文件案例素材-吉他英雄.zip

    独立光伏系统仿真模型研究:Boost升压与双闭环控制策略及技术应用分析

    内容概要:本文详细探讨了独立光伏系统的仿真模型及其控制策略。首先介绍了光伏组串模型的搭建方法,利用Simulink中的S函数实现特性曲线,确保高精度输出。接着重点讨论了Boost升压电路的改进型功率环控制策略,通过非线性积分器有效避免了占空比过高的风险,使系统震荡幅度显著降低。对于储能部分,采用双向DCDC转换器,实现了充放电模式间的平滑切换,并通过互补PWM技术增强了硬件死区保护效果。逆变器部分则采用了单极调制方式,减少了开关损耗,并优化了LC滤波参数的设计,确保了低谐波失真率。此外,还设计了一个基于继电器的智能负载模拟系统,能够根据交流电压的变化自动调节负载,提高了仿真的效率和准确性。最后,通过对整个系统的动态优先级管理,使得光伏出力波动时储能系统可以迅速响应,保持直流母线电压稳定。 适合人群:从事光伏系统设计、仿真建模以及电力电子领域的工程师和技术人员。 使用场景及目标:适用于需要深入了解独立光伏系统内部工作原理的研究人员,帮助他们掌握从光伏组串到逆变器各环节的具体实现细节,为实际工程项目提供可靠的理论支持和技术指导。 其他说明:文中提供了大量MATLAB/Simulink代码片段和具体参数设置建议,便于读者理解和复现实验结果。同时强调了不同控制策略之间的对比分析,指出了最优解的选择依据。

Global site tag (gtag.js) - Google Analytics