一、表之间的关系
1.一对一
2.一对多
3.多对多
二、表之间关系建表原则
1.一对多:在多的一方创建一个外键,指向一的一方的主键
2.多对多:创建一个中间表,中间表至少有两个字段,分别作为外键指向多对多双方的主键
3.一对一:主键一一对应,或当成一对多来看待。
三、一对多实现
1)定义
1.在1的domain类中定义:
private Set<link> links= new HashSet<>();
在相应映射配置文件中:
<!--一对多--> <set name="links"><!--set属性名称--> <key column="link_cust_id"></key><!--外键--> <one-to-many class="com.ual.domain.link"></one-to-many> </set>
如果想要保存记录的时候保存其级联的记录,需要在set 后添加
cascade="save-update"
2.在多的domain类中定义:
//一个联系人只对应一个客户 private customer customer;
在相应映射配置文件中:
<many-to-one name="customer" class="com.ual.domain.customer" column="link_cust_id" insert="false" update="false" lazy="false"></many-to-one>
加入lazy="false"后,在查询时会把记录相关的外键对应的记录一起查询出来。
3.在核心配置文件中,把映射关系写入
<mapping resource="com/ual/domain/customer.hbm.xml"/><!--告诉hibernate要操作哪些表,写入映射的配置文件的全路径--> <mapping resource="com/ual/domain/link.hbm.xml"></mapping>
4.实现插入
@Test public void test(){ Session session = HibernateUtil.getCurrentSession(); Transaction transaction = session.beginTransaction(); customer c1 = new customer(); c1.setCust_name("c1"); customer c2= new customer(); c2.setCust_name("c2"); link link1 = new link(); link1.setLink_name("link1"); link link2 = new link(); link2.setLink_name("link2"); link link3 = new link(); link3.setLink_name("link3"); /*配置关系*/ c1.getLinks().add(link1); c1.getLinks().add(link3); c2.getLinks().add(link2); link1.setCustomer(c1); link2.setCustomer(c2); link3.setCustomer(c1); /*保存联系人*/ session.save(c1); session.save(c2); session.save(link1); session.save(link2); session.save(link3); transaction.commit(); }
配置关系时,一般使用双向维护
2)查询
@Test public void test2(){ Session session = HibernateUtil.getCurrentSession(); Transaction transaction = session.beginTransaction(); link link=session.get(com.ual.domain.link.class,6L); transaction.commit(); System.out.println(link.getLink_name()); System.out.println(link.getCustomer().getCust_name()); }
注:
级联操作:
1.问题:在两张表建立一对多关系时,如果只保存一边的对象,会引发异常
2.级联操作:
什么时级联操作:在操作一个对象时,是否会操作其关联的对象
级联分类:
级联保存或更新:cascade="save-update"
级联删除:cascade="delete,save-update"
级联是有方向性的:保存的是谁就到谁里面做级联,删除的是谁就到谁里面做级联
3)更新
@Test public void test4(){ Session session = HibernateUtil.getCurrentSession(); Transaction transaction = session.beginTransaction(); //更新 link link=session.get(link.class,10L); customer customer=session.get(com.ual.domain.customer.class,13L); //10本来关联12,现让其关联13 //双向维护 customer.getLinks().add(link); link.setCustomer(customer); session.update(customer); transaction.commit(); }
注: 由于使用的双向维护,两方同时去维护一个外键,会产生性能问题,可以让一方放弃维护外键,只让外键所在的表维护外键
需要配置:在1的配置文件中:加inverse="true"
四、多对多关系实现
原文:https://www.cnblogs.com/UalBlog/p/10604573.html