hibernate关联:一对多

xiaoxiao2025-05-24  34

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

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

转载请注明原文地址: https://www.6miu.com/read-5030645.html

最新回复(0)