Hibernate bean 对象配制文件

 2023-09-10 阅读 19 评论 0

摘要:Hibernate bean 对象配制文件 class Person{private int pid; } 1 配制主键 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernat

Hibernate bean 对象配制文件


class Person{private int pid;
}
1 配制主键
<?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>
  • class 相关设置
    name 对应的bean数据类对象路径  例如这里使用的是 cn 包下的 Person类 table 对应的表的名称 
    select-before-update="true" 这个属性的时候 在进行更新的操作,会先进行查询操作,如果数据有改变那么就进行更新操作,如果数据没有改变,就不进行更新操作 在判断是否进行了修改,其是判断的是快照缓存区
    class 可设置动态 insertupdate,默认值:falsedynamic-insert="true" 如果生产insert语句,属性内容为null,生产的sql语句中将没有该字段。dynamic-update="true" 只有内容被修改才进行更新。默认更新所有。注意:如果使用动态更新,数据必须是查询获得的,此时修改的内容将被更新,其他内容不变。
    class 设置懒加载  lazy = "true" 默认为true
  • 主键配制说明
<id></id> 标签中 可设置相关的属性
属性名对应值
nameOID 属性名称 也就是对应对象名称
column表字段列名
access确定访问属性或字段
length表字段长度
type表字段类型
unsaved-valuesave或update方法使用依据 String ,默认null,如果使用unsaved-value=”abc” ,当执行save方法,设置“abc”相当之前null
    generator 标签主键生成策略,hibernate根据设置生成OID的值方案
                                                      
                                                                                                                                                                                                                                                                                                                                                                                                   
generator标签 class对应名称class 对应值 案例
1 incrementhibernate 自己维护表的数据自动增强,在执行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自然主键,生成手动设置。例如身份证
  • 例 4
<generator class="hilo"><param name="table">hi_value</param><param name="column">next_value</param><param name="max_lo">100</param>
</generator>

hibernate配置文件。


2 配制其他属性
<?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 相关设置
    <property> 可以设置,允许当前属性是否在sql语句中 。默认值:trueinsert="false" 表示生产insert语句,没有当前字段。update="false" 表示生产update语句,没有当前字段。案例 : <property name="title" insert="false" update="false"></property>
  • name : 默认用于配置javabean属性名称
  • length : 配置长度,字符串默认255,mysql类型 varchar(255)
  • column : 当前属性对应表中字段(列)名称,默认name的值
方式1:column属性(attribute) , <property column="">
方式2:子标签 <property> <column name="name"></column>
  • type: 数据字段类型
    方式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 表示日期时间。
  • access ,用于确定当前属性如何进行数据封装
    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的什么方法、

3 多对一配制
方案一 
  • 多方的配制
//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-updatedelete 总和cascade  设置为 all-delete-orphan,代表 所有    
4 多对多配制
  • 一方的配制
<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进行查询
5 类中组件配制

使用 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>
6 继承映射配制
  • 继承关系类描述
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;}
  • 方式一 使用 sub-class 标签来处理
    所有的内容都保存在一张表中 
<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>
  • 方式二 使用joined-subclass 标签来处理
    每个子类都有一张表 

<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
  • 方式三 使用union-subclass 标签来处理
    每个子类都有一张表 所有的子类 与 父类 共用主键策略

<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>

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/35427.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息