hibernate笔记(双向一对多关联映射)

双向一对多关联映射

所谓一对多就是:一个对应多个,如一个班级有多个学生。一个客户有多个订单。。

这种关联关系在hibernate中主要在映射文件中体现:

我们可以试着写个小例子:一个客户customer类,一个订单类

	/*
	 * 客户类
	 */
	private Long id;//主键id
	private String name;//客户名称
	private Set<Order> orders;//一对多,通过该变量可以引用到对应的Order集合对象
	public Set<Order> getOrders() {
		return orders;
	}
	public void setOrders(Set<Order> orders) {
		this.orders = orders;
	}
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	private Long id;//主键id
	private String OrderNumber;//订单号
	private Customer customer;//多对一,通过该变量可以引用到关联的customer对象。
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getOrderNumber() {
		return OrderNumber;
	}
	public void setOrderNumber(String orderNumber) {
		OrderNumber = orderNumber;
	}
	public Customer getCustomer() {
		return customer;
	}
	public void setCustomer(Customer customer) {
		this.customer = customer;
	}
然后是在两个映射文件中配置这种关联关系,这是最关键的地方。

	<class name="com.test.bean.Customer" table="customes">
		<id name="id" column="id" type="long">
			<generator class="increment"/>
		</id>
		<property name="name" column="name" type="string"></property>
		<!--一对多的关联关系-->
		<!-- cascade:表示级联:对这张表的操作可能就会关系到另一张表的操作,
		save-update表示当对当前这个对象进行保存或更新的时候,就会关联到需要保存的或更新的对象,如果是none表示操作的是当前对象不会与其他对象产生关联关系-->
		<!-- inverser:true:表示多的这个方来维护这个关联关系,false:由一这方来维护这种关联关系 -->
		<set name="orders" cascade="save-update" inverse="true">
			<!-- order表中的customer_id是外键来对应customer表中的id主键 -->
			<key column="customer_id"></key>
			<!-- set集合对应的类型是订单项 -->
			<one-to-many class="com.test.bean.Order" />
		</set>
	</class>

	<class name="com.test.bean.Order" table="Orders">
		<id name="id" column="id" type="long">
			<generator class="increment"/>
		</id>
		<property name="OrderNumber" column="order_number" type="string"></property>
		<!-- 多对一。name:订单类的客户对象,column:当前table对应的外键 -->
		<many-to-one name="customer" class="com.test.bean.Customer" column="customer_id"/>
	</class>

当然首先应该建表的:

custommers表

orders表。

最后测试:

private static SessionFactory sessionfactory;
	static{
		try {
			//创建会话工厂
			sessionfactory=new Configuration().configure().buildSessionFactory();
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Session session=sessionfactory.openSession();
		Transaction tx=session.beginTransaction();
		
		try {
			Customer customer=new Customer();
			customer.setName("张三");
			customer.setOrders(new HashSet<Order>());
			
			Order order1=new Order();
			order1.setOrderNumber("order1");
			
			Order order2=new Order();
			order2.setOrderNumber("order2");
			
			Order order3=new Order();
			order3.setOrderNumber("order3");
			
			order1.setCustomer(customer);
			order2.setCustomer(customer);
			order3.setCustomer(customer);
			
			customer.getOrders().add(order1);
			customer.getOrders().add(order2);
			customer.getOrders().add(order3);
			
			session.save(customer);
			tx.commit();
			
		} catch (Exception e) {
			if(null!=tx)
				tx.rollback();
			e.printStackTrace();
		}finally{
			session.close();
		}
最后我们可以发现:我们只保存了客户对象。但是订单也同时保存了。这就是因为我们实现了两者之间的双向关联关系。

看看控制台的显示sql语句:

Hibernate: 
    select
        max(id) 
    from
        customes
Hibernate: 
    select
        max(id) 
    from
        Orders
Hibernate: 
    insert 
    into
        customes
        (name, id) 
    values
        (?, ?)
Hibernate: 
    insert 
    into
        Orders
        (order_number, customer_id, id) 
    values
        (?, ?, ?)
Hibernate: 
    insert 
    into
        Orders
        (order_number, customer_id, id) 
    values
        (?, ?, ?)
Hibernate: 
    insert 
    into
        Orders
        (order_number, customer_id, id) 
    values
        (?, ?, ?)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值