欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

同时完成多表的创建保存,表关系设置——服务框架(SSH框架整合)

程序员文章站 2022-05-09 09:22:06
...

一、简介

Javaweb中开发中必然会有多个javabean对象,而对象之间必然会存在的关系。那么对象之间的关系在关系型数据库中,如MySql、Oracle、Sql Server数据库中是如何体现这里关系的呢。

Javabean一般在数据库中是以表的形式体现,而java对象之间的关系(不管是简单的还是复杂的关系)都是以表外键约束来体现的。

二、Java对象关系与数据库表之间的关系映射

从实现事务来分,事务之间存在的多对多、多对一、一对一三种关系。比如学生与老师的关系,是多对多的关系(一个学生有多位老师,而一位老师教多位学生),员工与部门的关系,是多对一关系(多个员工对应一个部门),公民与身份证的关系,是一对一关系。在实现开发中,建议使用多对一描述对象关系。尽量的避免使用多与多与一对多的关系。

1>多对多关系映射(双向) 实现开发中建议使用单向的。比如只在Teacher类中保有Student等..

同时完成多表的创建保存,表关系设置——服务框架(SSH框架整合)

 

2>多对一关系映射(单向) 实现开发中也建议使用单向的,在多的一方建立关系

同时完成多表的创建保存,表关系设置——服务框架(SSH框架整合)

 

3>一对一关系映射

同时完成多表的创建保存,表关系设置——服务框架(SSH框架整合)

 

三、多表操作实现思路

如果需同时保存两张表,一个用户表,一个订单表,当点击保存按钮时,通过ajax发送请求到后台控制器controller,在控制器里面先去判断该用户是否存在,即先调用判断用户是否存在的方法,然后对该方法的返回值进行判断,如果该用户存在,则保存订单表,即调用保存订单表的方法;如果该用户不存在,先要保存用户表,即调用保存用户表的方法,然后对该方法的返回值进行判断,成功的话再去保存订单表。

四、代码演示

游客类:

package com.bw.bean;

/**
 * 旅客类
 * 
 * @author 
 *
 */
public class Traveller {
	private int tid;
	private String tname;
	private String sex;
	private String birth;
	private String callphone;
	private String iDCard;

	public int getTid() {
		return tid;
	}

	public void setTid(int tid) {
		this.tid = tid;
	}

	public String getTname() {
		return tname;
	}

	public void setTname(String tname) {
		this.tname = tname;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public String getBirth() {
		return birth;
	}

	public void setBirth(String birth) {
		this.birth = birth;
	}

	public String getCallphone() {
		return callphone;
	}

	public void setCallphone(String callphone) {
		this.callphone = callphone;
	}

	public String getiDCard() {
		return iDCard;
	}

	public void setiDCard(String iDCard) {
		this.iDCard = iDCard;
	}

	public Traveller(int tid, String tname, String sex, String birth, String callphone, String iDCard) {
		super();
		this.tid = tid;
		this.tname = tname;
		this.sex = sex;
		this.birth = birth;
		this.callphone = callphone;
		this.iDCard = iDCard;
	}

	public Traveller() {
		super();
	}

	@Override
	public String toString() {
		return "Traveller [tid=" + tid + ", tname=" + tname + ", sex=" + sex + ", birth=" + birth + ", callphone="
				+ callphone + ", iDCard=" + iDCard + "]";
	}

}

配置文件的写法: 

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

<hibernate-mapping>
    <class name="com.bw.bean.Traveller" table="m_traveller">
        <id name="tid" type="java.lang.Integer">
            <column name="tid" />
            <generator class="native"></generator>
        </id>
        <property name="tname" type="java.lang.String">
            <column name="tname" />
        </property>
        <property name="sex" type="java.lang.String">
            <column name="sex" />
        </property>
        <property name="birth" type="java.lang.String">
            <column name="birth" />
        </property>
        <property name="callphone" type="java.lang.String">
            <column name="calphone" />
        </property>
        <property name="iDCard" type="java.lang.String">
            <column name="iDCard" />
        </property>
    </class>
</hibernate-mapping>

旅游路线类:

package com.bw.bean;

import java.util.Set;

/**
 * 旅游路线类
 * 
 * @author 
 *
 */
public class TravelPath {
	private int pid;
	private String pname;
	private String content;
	private String bmStart;
	private String bmStop;
	private String action;
	private String acStop;
	private double price;
	private int count;

	private Set<Traveller> set;

	public int getPid() {
		return pid;
	}

	public void setPid(int pid) {
		this.pid = pid;
	}

	public String getPname() {
		return pname;
	}

	public void setPname(String pname) {
		this.pname = pname;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public String getBmStart() {
		return bmStart;
	}

	public void setBmStart(String bmStart) {
		this.bmStart = bmStart;
	}

	public String getBmStop() {
		return bmStop;
	}

	public void setBmStop(String bmStop) {
		this.bmStop = bmStop;
	}

	public String getAction() {
		return action;
	}

	public void setAction(String action) {
		this.action = action;
	}

	public String getAcStop() {
		return acStop;
	}

	public void setAcStop(String acStop) {
		this.acStop = acStop;
	}

	public double getPrice() {
		return price;
	}

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

	public int getCount() {
		this.count = this.set.size();
		return count;
	}

	public void setCount(int count) {
		this.count = count;
	}

	public Set<Traveller> getSet() {
		return set;
	}

	public void setSet(Set<Traveller> set) {
		this.set = set;
	}

	public TravelPath(int pid, String pname, String content, String bmStart, String bmStop, String action,
			String acStop, double price, int count, Set<Traveller> set) {
		super();
		this.pid = pid;
		this.pname = pname;
		this.content = content;
		this.bmStart = bmStart;
		this.bmStop = bmStop;
		this.action = action;
		this.acStop = acStop;
		this.price = price;
		this.count = count;
		this.set = set;
	}

	@Override
	public String toString() {
		return "TravelPath [pid=" + pid + ", pname=" + pname + ", content=" + content + ", bmStart=" + bmStart
				+ ", bmStop=" + bmStop + ", action=" + action + ", acStop=" + acStop + ", price=" + price + ", count="
				+ count + ", set=" + set + "]";
	}

	public TravelPath() {
		super();
	}

}

配置文件:

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

<hibernate-mapping>
    <class name="com.bw.bean.TravelPath" table="m_travelPath">
        <id name="pid" type="java.lang.Integer">
            <column name="pid" />
            <generator class="native"></generator>
        </id>
        <property name="pname" type="java.lang.String">
            <column name="pname" />
        </property>
        <property name="content" type="java.lang.String">
            <column name="content" />
        </property>
        <property name="bmStart" type="java.lang.String">
            <column name="bmStart" />
        </property>
        <property name="bmStop" type="java.lang.String">
            <column name="bmStop" />
        </property>
        <property name="action" type="java.lang.String">
            <column name="action" />
        </property>
        <property name="acStop" type="java.lang.String">
            <column name="acStop" />
        </property>
        <property name="price" type="java.lang.Double">
            <column name="price" />
        </property>
        <set name="set" table="p_t" lazy="false">
            <key column="p_id"></key>
            <many-to-many class="com.bw.bean.Traveller" column="t_id" lazy="false"></many-to-many>
        </set>
    </class>
</hibernate-mapping>

接着配置一下hibernate的核心配置。

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
/**
*    Hibernate核心配置文件
*
*/
<hibernate-configuration>

	<session-factory>
		
		<property name="dialect">
			org.hibernate.dialect.MySQLDialect
		</property>
		<property name="connection.url">
			jdbc:mysql://localhost:3306/b_practice
		</property>
		<property name="connection.username">root</property>
		<property name="connection.password">123456</property>
		<property name="connection.driver_class">
			com.mysql.jdbc.Driver
		</property>
		<property name="show_sql">true</property>
		<property name="hibernate.hbm2ddl.auto">update</property>
		<!-- 默认是auto  -->
		<property name="javax.persistence.validation.mode">none</property>
		<mapping resource="com/bw/bean/Traveller.hbm.xml"/>
		<mapping resource="com/bw/bean/TravelPath.hbm.xml"/>
	</session-factory>

</hibernate-configuration>

五、写在最后:

配置好了之后,运行我们的服务器,Hibernate会自动帮我们生成表格,多对多默认是三张表格(一张主表,一张中间表,一张从表),主表从表可以进行增删改查的操作,中间表只能做增删查的操作,注意没有修改的操作。

下面我们看一下生成的表关系为多对多的表格:

首先是主表:同时完成多表的创建保存,表关系设置——服务框架(SSH框架整合)

 

 

 

 

 

 

 

 

 

 

 

 

接着是从表:同时完成多表的创建保存,表关系设置——服务框架(SSH框架整合) 

 

 

 

 

 

 

 

 

 

 

 

 

两张表格的外键都是一样的,没有外键约束。同时完成多表的创建保存,表关系设置——服务框架(SSH框架整合)

 

 

 

最后是中间表:
同时完成多表的创建保存,表关系设置——服务框架(SSH框架整合)

 

 

 

 

 

 

 

 

 

 

 

 

 

最后是中间表的外键:同时完成多表的创建保存,表关系设置——服务框架(SSH框架整合)

 

 

 

 

 

总结:

从上面的图片列表中可以看出,表关系为多对多时,主表与从表的关联关系主要靠中间表来维护,中间表起到了主表的作用,但是要注意:中间表只能做增删查的操作,没有修改!没有修改!没有修改!想要做修改功能的话,默认是先对中间表进行查询,然后删除对应数据,在添加要修改的数据。

这样整体就完成了多表的同时保存,多对多的增删改查。

 

同时完成多表的创建保存,表关系设置——服务框架(SSH框架整合)点个赞嘛,点赞的人都好看。^_^