class Person{private int pid;
}
<?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="cn.Person" table="t_person"><!-- 主键 --><id name="pid"><generator class="native"></generator></id></class></hibernate-mapping>
name 对应的bean数据类对象路径 例如这里使用的是 cn 包下的 Person类 table 对应的表的名称
select-before-update="true" 这个属性的时候 在进行更新的操作,会先进行查询操作,如果数据有改变那么就进行更新操作,如果数据没有改变,就不进行更新操作 在判断是否进行了修改,其是判断的是快照缓存区
class 可设置动态 insert和update,默认值:falsedynamic-insert="true" 如果生产insert语句,属性内容为null,生产的sql语句中将没有该字段。dynamic-update="true" 只有内容被修改才进行更新。默认更新所有。注意:如果使用动态更新,数据必须是查询获得的,此时修改的内容将被更新,其他内容不变。
class 设置懒加载 lazy = "true" 默认为true
<id></id> 标签中 可设置相关的属性
属性名 | 对应值 |
---|---|
name | OID 属性名称 也就是对应对象名称 |
column | 表字段列名 |
access | 确定访问属性或字段 |
length | 表字段长度 |
type | 表字段类型 |
unsaved-value | save或update方法使用依据 String ,默认null,如果使用unsaved-value=”abc” ,当执行save方法,设置“abc”相当之前null |
generator 标签主键生成策略,hibernate根据设置生成OID的值方案
generator标签 class对应名称 | class 对应值 | 案例 |
---|---|---|
1 increment | hibernate 自己维护表的数据自动增强,在执行insert语句执之前,先查询。 | |
会有:高并发、或集群 存放问题。 | ||
2 identity | hibernate 将使用数据库底层自动增强,如 mysql quto-increment | |
3 sequence | hibernate 将使用数据库底层序列。例如:oracle 序列 | |
4 hilo | hibernate采用高低位算法(不支持自动增强,也不支持序列) | 例 4 |
hilo标签下 table ,设置数据库中,另一个表A的表名。 | ||
hilo标签下 column,表A的列名 | ||
hilo标签下 max_lo,一次操作多少条记录。100表示可以允许一次操作100条记录。 | ||
hilo标签下 算法:max_lo * next_value + next_value | ||
5 native | 根据底层数据库的能力选择 identity、sequence 或者 hilo 中的一个 | |
提示 | 以上5个类型要求:整形(long, short 或者 int) | |
6 uuid | 随机字符串32长度 | |
提示 | 以上6种OID值都是有hibernate自动生成:代理主键 | |
7 assigned | 自然主键,生成手动设置。例如身份证 |
<generator class="hilo"><param name="table">hi_value</param><param name="column">next_value</param><param name="max_lo">100</param>
</generator>
hibernate配置文件。
<?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="cn.Person" table="t_person"><property name="name" length="50" column="name" type="string" access="property"></property></class></hibernate-mapping>
<property> 可以设置,允许当前属性是否在sql语句中 。默认值:trueinsert="false" 表示生产insert语句,没有当前字段。update="false" 表示生产update语句,没有当前字段。案例 : <property name="title" insert="false" update="false"></property>
方式1:column属性(attribute) , <property column="">
方式2:子标签 <property> <column name="name"></column>
方式1:hibernate类型,例如:string方式2:java类型,例如:java.lang.String方法3:mysql类型,例如:varchar(50)<column name="name" sql-type="varchar(50)" />日期时间类型date , 日期 java.util.Date , 对应jdbc类型:java.sql.Datetime , 时间 java.util.Date , 对应jdbc类型:java.sql.Timetimestamp,时间戳 java.util.Date (注意:时间戳随着数据更改变化) , 对应jdbc类型:java.sql.Timestamp项目使用:字符串、long (date.getTime())、日期时间类型使用数据的datetime 表示日期时间。
property : 默认值,hibernate采用javabean属性 与 表字段进行对应。在javabean必须提供 getter/setter方法field : hibernate采用 javabean 字段 与 表字段进行对应。 可以没有getter/setter方法例如:private String username;noop : 提供给hibernate hql使用,数据库没有对应字段。一般不使用。precision 和 scale 给 oracle配置,在mysql没有作用。precision 配置数字位数scale 配置小数位数 例如:numeric(precision,scale) , 12.34 numeric(4,2)
beanfactory调用bean的什么方法、
方案一
//name属性为当前订单中的名称
//calss 为多对一 中 一所代表的对象
//column 为多对一 之间联系的外键
<many-to-one name="customer" class="com.Customer" column="customer_id">
</many-to-one>
//name 代表本类中属性 //inverse 属性默认为false,设置为true,代表 一方不去对 多方进行维护 <set name="orderSet" inverse="true"> //key 标签中确定 一对多 之间的联系外键 <key column="customer_id"></key> //one-to-many 标签代表 一对多的 目标类<one-to-many class="com.Order"/></set>
方案二
//name属性为当前订单中的名称
//calss 为多对一 中 一所代表的对象
//column 为多对一 之间联系的外键
<many-to-one name="customer" class="com.Customer" column="customer_id">
</many-to-one>
清单配制
//name 代表本类中属性 //cascade <set name="orderSet" cascade="save-update"> //key 标签中确定 一对多 之间的联系外键 <key column="customer_id"></key> //one-to-many 标签代表 一对多的 目标类<one-to-many class="com.Order"/></set>
cascade 设置为none , 没有级联操作cascade 设置为 save-update,级连保存或者更新 当save一方的时候,如果这时关联了瞬时态的多方,那么将触发级联操作,将瞬时态的多方转为持久态,也就是多执行了一次insert,最后再执行updatecascade 设置为 delete,级连删除 当删除一方的时候,会同时去删除其所关联的多方 cascade 设置为 delete-orphan,孤儿删除 例如在 客户与订单 一对多,一个客户对应多条订单 当我们移除客户的一条订单的时候,Hibernate 默认方式是将订单从表中的对应的订单数据的外键置为了null,当我们设置了 column=" delete-orphan " 时,Hibernate会先将订单从表中的对应的订单数据的外键置为Null,再执行删除操作cascade 设置为 all,代表 可以拥有 save-update 和 delete 总和cascade 设置为 all-delete-orphan,代表 所有
<set name="studentSet" table="t_student_course"><key column="course_id"></key><many-to-many class="com.Student" column="student_id"></many-to-many>
</set>
<set name="courseSet" table="t_student_course"><key column="student_id"></key><many-to-many class="com.Course" column="course_id"></many-to-many></set>
多对多需要中间表来建立对应,set标签下的table就是用来设置中间表的名称的key 标签是用来设置本类在中间表就对应的列
many-to-many 标签 中,calss 对应的另一方的类,colum 对应的另一方在中间表中对应的列
在一对多 和多对多关系映射中 可设置 fetch 属性,与lazy属性fetch="join" ,lazy无效,hibernate 将使用“迫切左外连接”,底层执行sql语句就是“左外连接”只执行一条select,将当前对象及关联对象数据一次性查询出来。fetch="select" ,默认值,执行多条select语句lazy="false" 立即执行,在执行get方法时,立即执行多条select语句。lazy="true" 延迟执行,在执行get方法时先查询客户Customer,直到使用Order数据时才查询Orderlazy="extra" 极其懒惰,在执行get方法时先查询客户Customer(select t_customer),如果需要order 订单数,将执行聚合函数只查询数量(select count() t_order),如果需要详情再查询详情(select t_order))。fetch="subselect" ,采用子查询lazy 取值与 fetch="select" 相同。注意:必须使用Query进行查询
使用 component 标签
public class Person {private Integer pid; //OID 值private String name;//组合private Address homeAddress;private Address companyAddress;}
public class Address {//值对象 (vo 值对象/po 持久对象/bo 业务对象)private String addr;private String tel;}
<hibernate-mapping><class name="com.Person" table="t_person"><id name="pid"><generator class="native"></generator></id><property name="name"></property><component name="homeAddress" class="com.Address"><property name="addr" column="homeAddr"></property><property name="tel" column="homeTel"></property></component><component name="companyAddress" class="com.Address"><property name="addr" column="companyAddr"></property><property name="tel" column="companyTel"></property></component></class></hibernate-mapping>
public class Employee {private Integer eid;private String name;}public class HourEmployee extends Employee {private int rate; //零钱}public class SalaryEmployee extends Employee {private int salary;}
所有的内容都保存在一张表中
<hibernate-mapping><class name="com.Employee" table="t_employee" discriminator-value="员工"><id name="eid"><generator class="native"></generator></id><discriminator column="etemp"></discriminator><property name="name"></property><subclass name="com.SalaryEmployee" discriminator-value="正式员工" ><property name="salary"></property></subclass><subclass name="com.HourEmployee" discriminator-value="小时工"><property name="rate"></property></subclass></class></hibernate-mapping>
每个子类都有一张表
<hibernate-mapping><class name="com.Employee" table="j_employee"><id name="eid"><generator class="native"></generator></id><property name="name"></property><joined-subclass name="com.HourEmployee" table="j_hour"><key column="hid"></key><property name="rate"></property></joined-subclass><joined-subclass name="com.SalaryEmployee" table="j_salary"><key column="sid"></key><property name="salary"></property></joined-subclass></class></hibernate-mapping>
eid 是j_employee表中的主键,同时关联着从表j_hour中主键rate 与从表 j_salary 中主键 sid
每个子类都有一张表 所有的子类 与 父类 共用主键策略
<hibernate-mapping><class name="com.Employee" table="u_employee"><id name="eid"><generator class="increment"></generator></id><property name="name"></property><union-subclass name="com.HourEmployee" table="u_hour"><property name="rate"></property></union-subclass><union-subclass name="com.SalaryEmployee" table="u_salary"><property name="salary"></property></union-subclass></class></hibernate-mapping>
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态