一、id 生成方式
1,序列sequence 只适用于Oracle, seqhilo 就不用自己建sequence;默认用数据库里的hibernate_sequence;
<id name="id" column="id">
<generator class="seqhilo"> <!-- hibernate_sequence.nextval -->
<generator class="sequence">
<param name="sequence">person_seq</param><!--指定sequence名-->
</generator>
</id>
2,自增列,适用于SQLServer和mysql
mysql建表时加上:id integer auto_increment primary key,
SQLServer加上:identity
<id name="id" column="id">
<generator class="identity"/>
</id>
3,从表中取最大值加一,DB2和mysql
<id name="id" column="id" type="integer">
<generator class="increment"/>
</id>
不适合多线程;不多用;
4,根据底层数据库指定生成方法;
<id name="id" column="id">
<generator class="native"/>
</id>
hibernate自己选用哪种生成方式;
对于Oracle来说还是用的hibernate_sequence ;
这种比较方便;
5,高低位算法;跟数据库无关的;
<id name="id" column="id">
<generator class="hilo">
<param name="table">high_value</param>
<!--设置高位值取值的表-->
<param name="column">next_value</param>
<!--设置高位值取值的字段-->
<param name="max_lo">50</param>
<!--指定低位最大值,当取道最大值是会再取一个高位值再运算-->
</generator>
</id>
6, uuid 全球唯一的数字,根据时间,ip地址等计算,保证不同;32位16进制;
但是是字符串格式的;将id也改成字符串格式即可;将表的字段长度加长,最少32位;
<generator class="uuid.hex"/>
assigned:自赋值
select ,foreign ;从别的表取;
二、基本类型
Date :java里的类型
存日期类型时,要指明 type="date" , 告诉hibernate 用数据库中的哪种类型;
大多数情况下可以省略type;
三、关联映射:
关联关系的数量和方向,从面向对象的角度去理解,不要面向数据库去理解;
1、 一对一:
java中的一对一,就是互相维护一个引用
1) 唯一外键:
a. (单向一对一)
数据库中主外键的关系其实是一对多的关系:
A pk - fk(b-pk) n 外键可以多次引用一个主键;
B pk 1
要想变成唯一,在外键的表上加上unique约束;
Address 实体类里,有几个属性才在xml文件里配置;
在Account 里有一个Address的引用,叫关联属性;
代表了单向的一对一的关系;
<many-to-one name="addr" column="fid" unique="true" cascade="all">
name是属性的名字;column是字段名;是一个唯一外键,引用另一张表的主键;
表示一个account对应一个address;不能多个account对应一个address
数据库里用的是外键,必须用<many-to-one> 标签;
many -> account
one -> address 只知道address是一;不知道account是几;需要去address里去读;
unique=true;//表示我这里是一;不加就表示单向的多对一了;
到address里去读就是0;因为没有我的引用;
从逻辑上不知道是多对一还是一对一;所以写 标签上写 <many-to-one> ;
写不写unique=true ; 这就需要从业务来考虑;
站在PO的角度考虑写什么标签;至于业务上的要求,再加约束;
cascade :级联操作,存本对象时关联存子对象;重点考虑;
只存account,便会关联去存address;
unique=true :表示外键唯一;
create table ln_address(
oid number(20) primary key,
postcode varchar2(20),
city varchar2(20),
street varchar2(30)
);
create table ln_account(
aid number(20) primary key,
actNo varchar(100) not null,
owner varchar(20) not null,
balance number(20,2),
fid number(20) not null unique,
constraint account_address foreign key(fid)
references ln_address(oid)
);
?:1 m:1
Account : address ?-----> 1 Address
<many-to-one> //在不明确的情况下写这个
<one-to-one> //在很明确的情况下写这个,即使很明确的情况下也可以用<many-to-one>
b. (双向一对一)
在Address 中加一个 account 属性;
在 Address 中的 setAccount(Account a){ this.account=a;
addr.setAccount(this);
}
不能两边都加;否则死循环;在哪边加都可以,看业务需求;
在Address的配置文件中加上:
<one-to-one name="account" cascade="all">
只能在一边写 <many-to-one> ;并且给外键加上唯一约束;
<many-to-one> 和 <one-to-one> 可以互换;
那么将外键移到address表里,它的xml文件就是<many-to-one>
account的xml文件就是<one-to-one> ;
外键在哪个表里,哪个标签就是<many-to-one>;
这时候存方向的哪一方都会级联存另一方;
注意:表没有单向和双向的关系;
存 address 时 ,正常存属性 ,读到 <one-to-one> 时,一对一是po之间的关系;
知道了是关联属性,到另外一个映射文件中,
name=“account” ,找到account所对的类的映射文件;
存account 表,表里有一个外键,把address的主键拿过来存进来就行;
先存主键的一方,外键才有值;
在hibernate.cfg.xml中加上,映射文件写好后;自动产生表:
<property name="hbm2ddl.auto">create</property>
每次都是新建表,所以记录都是刚刚插入的记录;
2)共享主键:这个用的多;POJO类不用变;
address 的主键又是外键 和 account 的值一致;
account的xml文件:
<one-to-one name="address" cascade="all" >
address 的xml文件:
<id name="oid" column="oid"> 既是主键又是外键;值是从它引用的外键得到的;
<generator class="foreign"> <!--表示主键引用的是别的表 -->
<param name="property">account</param>
</generator>
</id>
<one-to-one name="account"
constrained="true" cascade="all"/>
constrained="true";//acct所对应的类型的表,account表,对我现在的表形成了外键约束;
//account表的主键对address表的主键形成了外键约束;
上边和下边一一对应;是互补的;
四 、HQL Query
1、
from + 表名; //查询表中的所有对象的集合;
Query q=s.createQuery("from Account");
List l=q.list();
Iterator it=l.iterator();
while(it.hasNext()) {
Account acc=(Account)it.next();
System.out.println(" owner: "+acc.getOwner()+" balance: "+acc.getBalance());
}
2、 Account acco=(Account)q.uniqueResult();//只有确定只有一个对象时才能用这个;
3、 条件查询:
Query q=s.createQuery("from Account a where a.actNo=?");
q.setString(1,"10001");
acco=(Account)q.uniqueResult();//规定帐号唯一;只能返回一条记录;
"from Account a where a.actNo=:actNo"
q.setString("actNo",xxx);
或者
"from Account a where a.actNo=?"
q.setString(0,xxx);
分享到:
相关推荐
【hibernate培训第二天】——深入理解Hibernate框架 在软件开发中,ORM(Object-Relational Mapping)框架已经成为连接数据库与应用程序的重要桥梁,而Hibernate作为Java领域中的主流ORM框架,其强大而灵活的功能...
在深入探讨Hibernate学习笔记第二天的源码之前,我们先来理解一下Hibernate的核心概念。Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作转化为对象模型,大大简化了数据访问层的开发...
**hibernate+spring复习大纲** 在Java Web开发领域,Hibernate和Spring是两个至关重要的框架。Hibernate是一个对象关系映射(ORM)框架,它简化了数据库操作,而Spring则是一个全面的企业级应用框架,提供了依赖...
标题“学习hibernate第二天”表明我们正在探讨的是关于Hibernate框架的初步学习过程,特别是第二天的学习内容,这通常涉及到更深入的理论和技术细节。Hibernate是一个Java语言中的对象关系映射(ORM)框架,它允许...
《Hibernate达内五天复习笔记》是一份详细记录了Hibernate框架学习的资料,旨在帮助读者深入理解并掌握Hibernate这一强大的Java持久化框架。以下是笔记中的主要知识点: 1. **ORM原理**: - **对象持久化**:将...
孙卫琴hibernate实战第二版书及源码
hibernate
《图灵程序设计丛书·Hibernate实战(第2版)》是毋庸置疑的Hibernate和ORM(对象/关系映射)权威著作,由包括Hibernate之父在内的两位核心开发人员亲自执笔,详细讲述了Hibernate 3.2、Java Persistence和EJB 3.0标准...
《Hibernate实战》第二版是一本深入探讨Java领域中ORM(对象关系映射)技术的经典教程。Hibernate作为Java EE开发中的重要框架,它有效地解决了数据库与Java对象之间的转换问题,简化了数据操作。这本书针对初学者和...
《Hibernate入门:第一天笔记详解》 Hibernate,作为Java领域中著名的ORM(Object-Relational Mapping)框架,极大地简化了数据库操作,让开发者可以更加专注于业务逻辑而不是底层的数据访问。本文将基于第一天学习...
#### 二、书籍内容概述 本书不仅是一本教程和参考指南,还深入介绍了如何开发和优化工业级别的Hibernate应用程序。作者们按照从简单到复杂的顺序逐步介绍概念,并通过丰富的实例来解释每一个细节。以下是本书覆盖的...
【标题】:“Hibernate知识复习二:组合映射” 在Java Web开发中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它简化了数据库操作,将数据库中的表映射为Java对象,使得开发者可以像操作普通对象一样操作...
《精通Hibernate:Java持久化对象技术详解[第二版]》是一部深入探讨Hibernate框架的专业书籍,旨在帮助Java开发者熟练掌握和运用这一强大的ORM(Object-Relational Mapping)工具。Hibernate是Java开发领域中广泛...
这本书的第二版由Hibernate的创始人Gavin King亲自撰写,针对Hibernate 3进行了全面的更新,以适应当时最新的技术和最佳实践。 Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者以面向对象的方式...
本书由互联网上影响广泛的开放文档OpenDoc系列自由文献首份文档“Hibernate开发...深入浅出hibernate(PDF)第二部分,深入浅出hibernate(PDF)第三部分全部下载,并解压到一个地方才可以正常解压阅读.给大家带来不便望谅解.
Hibernate实战 第二版 中文版 Hibernate实战 第二版 中文版
《Hibernate实战第二版》这本书是Hibernate创始人Gavin King亲自撰写的一部权威指南,它深入浅出地探讨了Hibernate这一强大的对象关系映射(ORM)框架。对于任何希望掌握Java编程并利用ORM技术来简化数据库操作的...
但是,考虑到标题和描述中提到的“hibernate实战 第2版.pdf”,我们可以基于这个信息来生成关于Hibernate的知识点。以下是根据这一主题撰写的详细知识点: Hibernate是一个开放源代码的对象关系映射(ORM)框架,...
Hibernate二级缓存是一种提高应用程序性能的技术,它将数据存储在SessionFactory级别的缓存中,使得数据可以在不同的Session之间共享。这与一级缓存(Session级别)不同,一级缓存仅存在于单个Session生命周期内,当...