hibernate关联:一对多

一:什么是关联
关联指的是类之间的引用关系。如果类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());  //默认强制加载
		}

普通删除
先查在删
先把订单项删掉,在删订单

猜你喜欢

转载自blog.csdn.net/lisacheni/article/details/83376155
今日推荐