多对一关联映射(映射文件)
<many-to-one .../>标签属性
Column: 指定进行关联的外键列的列名,该列名默认与该属性同名
class:指定关联实体的全限定类名,默认是通过反射得到该属性所属类的类名。
cascade:该属性指定哪些持久化操作会从主表记录级联到子表记录。
fetch:该属性指定Hibernate的抓取策略,属性值只能是join(使用外连抓取)和select(使用选择抓取)两个值的其中之一。
update,insert:指定对应的字段是否包含在用于Hibernate生成的update或insert语句中,两个属性的默认值都是true。如果将二者指定为false,则表明这是一个纯粹的外源关联,它的值是通过映射同一个(或多个)字段的其他属性得到的,或由触发器或其他程序来负责完成。
property-ref:指定关联类的一个属性,这个属性将会和本类的外键相对应(当外键参照唯一键时需指定该属性)。如果没有指定,直接使用对方关联的主键。
access:指定hibernate访问此关联属性的访问策略,默认是property.
unique:指定Hibernate通过DDL为外键列添加唯一约束。此外,也可以用做property-ref的目标属性。这使关联同时具有一对一的效果。
not-null:指定使用DDL为外键字段添加非空约束。
optimistic-lock:该属性指定其更新时是否需要获得乐观锁定,也就是其他值决定引用关联实体的属性发生变化时版本值是否增长。
lazy:是否延迟加载可接收的值为false、proxy、no-proxy三个值。
not-found:该属性指定当外键参照的主表记录不存在时如何处理。该属性只接受ignore和exception两个值,默认是exception,即不存在时抛出异常;如果程序希望Hibernate忽略这个异常,则可指定该属性值为ignore。
formula:指定一个SQL表达式,该外键值将根据该SQL表达式来计算。
多对一单向关联映射
实现概述:
1.在多的一方设置一个外键关联
2.在多的一方实体类中维护另一个实体的引用
3.在多的一方使用<many-to-one .../>标签映射,一般设置not-null=”true”
假如有两张表t_customers(客户表)和t_orders(订单表),其中t_orders表的customer_id字段和t_customers表的id字段进行关联,形成多对一关系。
1、建立t_orders和t_customers表
create table if not exists webdb.t_orders(
id int(11) not null,
Order_number varchar(10) not null,
customer_id int(11) not null,
PRIMARY key (id),
Unique key address_id (address_id)
)ENGINE=InnoDB DEFAULT CHARSET=utf-8 COLLATE=utf8_unicode_ci;
create table if not exists webdb.t_customer(
id int(11) not null,
namevarchar(50) not null,
PRIMARY key (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf-8 COLLATE=utf8_unicode_ci;
2、对应的实体
public class Customer{
private Integer id;
private String name;
. . .
}
public class Order{
private Integer id;
private String number;
private Customer customer;
. . .
}
3、对应的映射文件配置:
Order.hbm.xml:
<class name="org.hibernate.test.Order" table="t_orders">
<id name="id" column="id" type="int">
<generator class="native"/>
</id>
<property name="number" column="order_number" type="string"/>
<!-- 用于映射关联实体 -->
<many-to-one name="customer" class="org.hibernate.test.Address"
column=”customer_id” cascade="save-update" />
</class>
Customer.hbm.xml
<class name="org.hibernate.test.Customer" table="t_customers">
<id name="id" column="id" type="int">
<generator class="intiva”/>
</id>
<property name="name" column="name" type="sring" />
</class>
一对多双向关联映射
实现概述:
1.在多的一方设置一个外键
2.在多的一方维护另一个实体的引用,在另一个实体类中维护一个集合
3.在多的一方使用<many-to-one .../>标签设置,在另一方使用<set .../>标签配置
1、建立t_orders和t_customers表
create table if not exists webdb.t_orders(
id int(11) not null,
Order_number varchar(10) not null,
customer_id int(11) not null,
PRIMARY key (id),
Unique key address_id (address_id)
)ENGINE=InnoDB DEFAULT CHARSET=utf-8 COLLATE=utf8_unicode_ci;
create table if not exists webdb.t_order(
id int(11) not null,
namevarchar(50) not null,
PRIMARY key (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf-8 COLLATE=utf8_unicode_ci;
2、对应的实体
public class Customer{
private Integer id;
private String name;
private Set<Order> orders = new HashSet<Order>();
. . .
}
public class Order{
private Integer id;
private String number;
private Customer customer;
. . .
}
3、对应的映射文件配置:
Order.hbm.xml:
<class name="org.hibernate.test.Order" table="t_orders">
<id name="id" column="id" type="int">
<generator class="native"/>
</id>
<property name="number" column="order_number" type="string"/>
<!-- 用于映射关联实体,customer_id为外键 -->
<many-to-one name="customer" class="org.hibernate.test.Address"
column=”customer_id” cascade="save-update" lazy=”false” not-null=”true”/>
</class>
Customer.hbm.xml
<class name="org.hibernate.test.Customer" table="t_customers">
<id name="id" column="id" type="int">
<generator class="intiva”/>
</id>
<property name="name" column="name" type="sring" />
<!-- inverse表示关联关系的维护工作由谁负责,默认为false,表示由主控方负责维护,如果为true,则表示由被控方来维护关联工作 -->
<set name="order" cascade="save-update,delete" order-by="order_number asc" lazy="true" inverse=”false”>
<key column="customer_id"/>
<one-to-many class="org.hibernate.test.Orders"/>
</set>
</class>
注意:虽然很多时候在装载Customer对象时,自动装载Order对象显得很方便,但是如果只想获得Customer对象中的信息,这时在装载Order对象就显得有些得不偿失,因此,在上面的配置代码中将<set>标签的lazy属性设置为true,这样就可以使hibernate框架只在使用Customer的orders属性时才装载Order对象。如果程序未访问orders属性,Hibernate是不会自动装载Order对象的。
一对多双向自身关联映射
例如商品分类,通常用一张表来存放所有的商品分类,分类之间的层级关系是典型的自身一对多双向关联关系。
1、建立t_goodscates表
create table if not exists webdb.t_goodcates(
id int(11) not null,
parent_id int(11),
cate_no varchar(30) not null,
cate_name varchar(30) not null,
PRIMARY key (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf-8 COLLATE=utf8_unicode_ci;
2、对应的实体
public class Goodscate{
private Integer id;
private String cateNo;
private String cateName;
private Goodscate parent;
Private Set<Goodscate> childs = new HashSet<Goodscate>();
. . .
}
3、对应的映射文件配置:
Goodscate.hbm.xml:
<class name="org.hibernate.test.Goodscate" table="t_products">
<id name="id" column="id" type="int">
<generator class="native"/>
</id>
<property name="cateNo" column="cate_no" type="string"/>
<property name="cateName" column="cate_name" type="string"/>
<!-- 映射子类别到父类别的多对一关联 -->
<many-to-one name="parent" column="parent_id" class="org.hibernate.test.Goodscate" lazy="false"/>
<!-- 映射父类别到子类别的一对多关联 -->
<set name="childs" cascade="all" inverse="true" lazy="false">
<key column="parent_id"/>
<one-to-many class="org.hibernate.test.Goodscate"/>
</set>
</class>
转载于:https://blog.51cto.com/dezewuyou/1835533