hibernate 一对多关系

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

猜你喜欢

转载自blog.csdn.net/t1136237940/article/details/83313913
今日推荐