1.首先在实体类描述数据库主外键关系,
比如 我有多个订单项
private Set<Order_item> orItems = new HashSet<>();
在Order_item定义order 属性
2.需要在映射的实体类描述关系,我这里是一个订单有多个订单项
order.hbm.xml
<set name="orItems" cascade="save-update" inverse="true">
<!-- 配置外键字段 -->
<key column="oid"></key>
<!-- 配置外键关联的表(类) -->
<one-to-many class="com.zking.hibernate.entity.Order_item"/>
</set>
order_item.hbm.xml
<many-to-one name="order" class="com.zking.hibernate.entity.Order" column="oid" ></many-to-one>
关于级联新增的错误:
Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: com.zking.hibernate.entity.Order_item column: oid (should be mapped with insert="false" update="false")
说明你未在你的外键上定义
insert="false" update="false"
级联查询
演示错误
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.zking.hibernate.entity.Order.orItems, could not initialize proxy - no Session
解决方法
Lazy=true介绍 查单个时存在问题
Lazy=false介绍 查所有时存在问题
解决方案:通过父类字段控制,强制加载。Hibernate.initialize()
演示:
public Order getOrder(Order order) {
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
Order o = session.get(Order.class, order.getOrder_id());
if (o != null && new Integer(1).equals(order.getInitOrderItems())) {
Hibernate.initialize(o.getOrItems());
}
transaction.commit();
session.close();
return o;
}
注意我这里是order对应多个order_item