hibernate关联关系映射(重点)

1. 关系数据库中的实体设计三种关系:
复习:
1. E-R图绘制:实体/类型/属性/方法
2. 实体之间的三种关系:一对一/一对多/多对多
3. 不同实体关系之间如何建表?
4. 一对一: 在任意的一方引入对方主键作为外键(开发中很少使用)
5. 一对多: 在多的一方添加一的一方的主键作为外键
如:customer(顾客编号,姓名…) 一的一方
order(订单编号,顾客编号…)多的一方
6.多对多:产生中间关系表,引入两个实体主键作为外键,两个主键联合成为联合主键
student(学号,姓名…)
course(课程号,课程名称…)
s_c(学号,课程号,分数…)------中间表
7.总结:一对一:外键可以在任意一方

                     一对多:外键在多的一方
                      
                     多对多:会生成中间表

2.一对多实践代码
创建Customer.java

package onetomany;

import java.util.HashSet;
import java.util.Set;

public class Customer {
    
    
	
	private Integer id;
	private String name;
	
	//用户有多个订单
	private Set<Order> orders= new HashSet<Order>();

	public Integer getId() {
    
    
		return id;
	}

	public void setId(Integer id) {
    
    
		this.id = id;
	}

	public String getName() {
    
    
		return name;
	}

	public void setName(String name) {
    
    
		this.name = name;
	}

	public Set<Order> getOrders() {
    
    
		return orders;
	}

	public void setOrders(Set<Order> orders) {
    
    
		this.orders = orders;
	}
	

}

创建Order.java

package onetomany;

public class Order {
    
    
	
	private Integer id ;
	private String address;//订单的收货地址
	private Double price;//订单价格
	
	//订单属于某一个客户
	private Customer customer;


	public Integer getId() {
    
    
		return id;
	}


	public void setId(Integer id) {
    
    
		this.id = id;
	}

	public String getAddress() {
    
    
		return address;
	}


	public void setAddress(String address) {
    
    
		this.address = address;
	}


	public Double getPrice() {
    
    
		return price;
	}


	public void setPrice(Double price) {
    
    
		this.price = price;
	}


	public Customer getCustomer() {
    
    
		return customer;
	}


	public void setCustomer(Customer customer) {
    
    
		this.customer = customer;
	}
	
}

创建顾客的配置文件:Customer.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

	<!-- name代表的是实体类名   table代表的是数据库表名-->
	<class name="onetomany.Customer" table="t_customer" catalog="hibernate">
		<!-- 主键 name代表的是Student类中的属性 column代表的是数据库表中的字段 -->
		<id name="id" column="id">
			<generator class="native"></generator>

		</id>
		
		<!-- 其他属性使用property标签来映射 -->
		<property name="name" column="name" type="string" />
		
		<!-- 映射集合属性 -->
		<set name="orders" >
			<key column="cid"></key>
			<one-to-many class="onetomany.Order"/>
		</set>		

	</class>

</hibernate-mapping>

创建订单的配置文件:Order.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

	<!-- name代表的是实体类名   table代表的是数据库表名-->
	<class name="onetomany.Order" table="t_order" catalog="hibernate">
		<!-- 主键 name代表的是Student类中的属性 column代表的是数据库表中的字段 -->
		<id name="id" column="id">
			<generator class="native"></generator>

		</id>
		
		<!-- 普通属性使用property标签来映射 -->
		<property name="address" />
		<property name="price" />

		<!-- 多对一关系映射  cid代表多是数据库生成多外键的名称-->
		<many-to-one name="customer" class="onetomany.Customer" column="cid" />
	</class>

</hibernate-mapping>

在hibernate核心配置hibernate.cfg.xml里面加入如下配置:

<mapping resource="onetomany/Customer.hbm.xml"/>
<mapping resource="onetomany/Order.hbm.xml"/>

编写测试代码:

@Test
	public void test1() {
    
    

		Session session = HibernateUtil.getSession();

		session.beginTransaction();

		// 1.创建customer对象

		Customer c = new Customer();

		c.setName("李本涛");

		// 2.创建order对象
		Order o1 = new Order();

		Order o2 = new Order();

		o1.setAddress("丽江");
		o1.setPrice(100d);

		o2.setAddress("曲靖");
		o2.setPrice(50d);

		// 3.关联关系---订单属于某一个顾客

		o1.setCustomer(c);
		o2.setCustomer(c);

		// 4. 一个顾客有多个订单

		c.getOrders().add(o1);
		c.getOrders().add(o2);

		// 5.保存

		session.save(c);

		session.save(o1);
		session.save(o2);

		session.getTransaction().commit();

		session.close();

	}

猜你喜欢

转载自blog.csdn.net/qq_49023625/article/details/124135128
今日推荐