一:什么是关联
关联指的是类之间的引用关系。如果类A与类B关联,那么被引用的类B将被定义为类A的属性。
传统的jdbc要查有关系的两张表,一般就是同连表查询
Hibernate就不要需要,它只需要维护实体类,表达清楚表与表之间的关系即可
列如:
Class Order(){
Private String oid;
…
Private Set orderIterm;
}
可以通过get(),它会自动导航把orderIterm也查询出来了
Session.get(Order.class,1)
级联新增:
1.在实体类中描述表与表之间的关系
注意:定义一对多的关系时一定需要采用接口的方式,不许使用实现类
//implements java.util.Set 代理实现的是set接口
private Set<OrderItem> orderItems=new HashSet<OrderItem>();
关系:
一个订单对应着多个订单项
一个订单项对应着一个订单
2.配置关系
一对多:
<!--
name:实体类的类属性
cascade:用来配置维护实体类之间的关系所用
inverse:(inverse="true")关系交由反方控制 即订单项 因为现在配置的是订单,所以反方是订单项
(inverse="true") 关系由自己控制 订单
lazy="false":立即加载
-->
<set lazy="false" name="orderItems" cascade="save-update" inverse="true">
<!-- 订单项外键 -->
<key column="oid"></key>
<!-- 一个订单对应多个订单项 -->
<one-to-many class="com.zking.four.entity.OrderItem"></one-to-many>
</set>
多对一:
报错:
Repeated column in mapping for entity;
Com.zking.four.entity.OrderIterm column: oid
(should be mapped with insert=”false” update=”false”)
重复的列:oid重复
同一个数据库的字段被映射了两次
解决方案:
1:将订单项实体类中的订单id这个属性干掉
2:在OederIterm的配置文件中,在oid后面加上 insert=”false” update=”false”,或者在order后面加上 insert=”false” update=”false”
<!-- 第一种加insert=false,update=false -->
<property name="oid" type="java.lang.Integer" column="oid" insert="false" update="false"></property>
<!-- 第二种加insert=false,update=false -->
<!-- <property name="oid" type="java.lang.Integer" column="oid"></property> -->
<!-- 多对一
order:orderItem里的属性,也是实体类
oid:实体类的属性所对应的后台的字段
-->
<!-- 会报错 :解决方法:第一种加,第二种加-->
<!-- 第一种加insert=false,update=false -->
<many-to-one name="order" class="com.zking.four.entity.Order" column="oid"></many-to-one>
<!-- 第二种加insert=false,update=false -->
<!-- <many-to-one name="order" class="com.zking.four.entity.Order" column="oid" insert="false" update="false"></many-to-one> -->
级连查询
报错:懒加载 Could not initialize proxy - no session
如果在配置文件中把它改为
Lazy=true; 查单个时存在问题
改为
Lazy=false; 查所有时存在问题
解决方案:通过字段控制,强制加载。Hibernate.initialize()
在实体类中定义一个参数
private Integer initOrderItem=0;//0代表懒加载 1代表立即加载
然后去dao方法中判断它是不是需要强制加载
if(o!=null&&new Integer(1).equals(order.getInitOrderItem())) {
Hibernate.initialize(o.getOrderItems()); //默认强制加载
}
普通删除
先查在删
先把订单项删掉,在删订单