Hibernate多对多的关联映射(如何配置,代码实现)

两个一对多的关系就构成了多对多的关系

举个例子:
  需求:程序员和项目之间的关系(编写一个项目的管理系统)

  程序员               项目

  一个程序员可以开发多个项目    程序员----->项目(一对多的关系)

 一个项目是由多个开发人员来进行开发   项目----->程序员(一对多的关系)

 Project(项目表)

 proId         proName       proStartTime       proEndTime      proDesc
 
 Develpoler(开发人员表)

  devId       devName        devDes            devGender           devTel

 t_relation(关系表)

 proId       devId

1.项目表代码

private int proId;
	private String proName;
	private Date proStartTime;
	private Date proEndTime;
	private String proDes;
	private Set<Develpoer> devs= new HashSet<Develpoer>();
上面的属性都生成gettter.setter方法和构造方法

2.开发人员表

private int devId;
	private String devName;
	private String devDes;
	private int devGender;
	private String devTel;
	private Set<Project> pros=new HashSet<Project>();
同上

3.hibernate总体配置

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>

    <session-factory>
		<!-- 数据库连接驱动 -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <!--
        	设置请求的数据库:
        		jdbc:mysql://localhost3306/hibernate_day1
        		如果是本地的数据库可以省略localhost33606
        		jdbc:mysql:///hibernate_day1
          -->
        <property name="connection.url">jdbc:mysql://127.0.0.1:3306/hibernate_day1</property>
        <!-- 用户名 -->
        <property name="connection.username">root</property>
        <!--密码  -->
        <property name="connection.password">0000</property>
		
		<!-- 数据库方言配置 针对不同的数据库配置不同的信息,例子是mysql -->
		<!--根据底层不同的数据库生成不同的sql语句  -->
        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>

        <!-- 是否将hibernate编写的数据库语句输出打控制台上(可检查其是否正确)-->
        <property name="show_sql">true</property>
        <!--格式化打印控制台输出的sql语句-->
        <property name="format_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">update</property>
        <!-- update 如果存在则更新表格,如果不存在就创建表格 
        	create 每次运行的时候都需要重新建表,不管其是否存在 -->
		
		<!-- 下面配置的是映射文件 -->
        <mapping resource="cn/pzhu/pojo/Develpoer.hbm.xml"/>
        <mapping resource="cn/pzhu/pojo/Project.hbm.xml"/>
		
    </session-factory>
</hibernate-configuration>


4..项目表的配置

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

<hibernate-mapping package="cn.pzhu.pojo" >
    <class name="Project" table="project" >
    <!-- 配置主键 -->
        <id name="proId" column="proId">
        	<!-- 自增长 -->
            <generator class="native"/>
        </id>
        <!-- 配置普通列 -->
        <property name="proName" type="java.lang.String" length="10"/>
		<property name="proStartTime"></property>
		<property name="proEndTime"></property>
		<property name="proDes" type="java.lang.String" length="10"></property>
		
		<set name="devs" table="t_relation" cascade="all">
			<key column="pro_id"></key>
			<many-to-many column="dev_id" class="Develpoer"></many-to-many>
		</set>
    </class>
</hibernate-mapping>
5.开发人员表的配置

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

<hibernate-mapping package="cn.pzhu.pojo" >
    <class name="Develpoer" table="develpoer" >
    <!-- 配置主键 -->
        <id name="devId" column="devId" type="java.lang.Integer">
        	<!-- 自增长 -->
            <generator class="native"/>
        </id>
        <!-- 配置普通列 -->
        <property name="devName" type="java.lang.String" length="10"/>
		<property name="devDes" type="java.lang.String" length="50"></property>
		<property name="devGender" type="java.lang.Integer" ></property>
		<property name="devTel" type="java.lang.String" length="11"></property>
		
		<!-- 配置多对多的集合映射 -->
		<set name="pros" table="t_relation" cascade="all">
			<!-- 这个key配置的是当前的类的主键 -->
			<key column="dev_id"></key>
			<!-- 
				column:配置的是对方的主键在关系表中映射的这个值的列名
				class:对方类的名字
			 -->
			<many-to-many column="pro_id" class="Project"></many-to-many>
		</set>
    </class>
</hibernate-mapping>
6.测试类

public class test_001 {
	@Test
	public void test_0012() {
		// TODO Auto-generated constructor stub
		Develpoer develpoer=new Develpoer("长安", "彩笔", GenderEnum.man.ordinal(), "123");
		Set<Project> projects=develpoer.getPros();
		
		projects.add(new Project("11111", new Date(), new Date(), "小乖乖"));
		projects.add(new Project("111112", new Date(), new Date(), "小乖乖2"));
		projects.add(new Project("111113", new Date(), new Date(), "小乖乖3"));
		projects.add(new Project("111114", new Date(), new Date(), "小乖乖4"));
		
		HibernateUtil.save(develpoer);
	}
	@Test
	public void test_1() {
		Project project=new Project("妹妹", new Date(), new Date(), "happy");
		
		Develpoer developer=new Develpoer();
		developer.setDevDes("十足的二货1");
		developer.setDevGender(GenderEnum.woman.ordinal());
		developer.setDevName("铁蛋1");
		developer.setDevTel("1314....");
		
		Develpoer developer1=new Develpoer();
		developer1.setDevDes("标准的码农1");
		developer1.setDevGender(GenderEnum.other.ordinal());
		developer1.setDevName("狗剩1");
		developer1.setDevTel("1571...");
		
		
		Set<Develpoer> developers=project.getDevs();
		developers.add(developer);
		developers.add(developer1);
		
		//最终调用类进行持久化
		
		HibernateUtil.save(project);
	}
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值