20150708 MyEclipse Hibernate Many To Many Mapping

原创 2015年07月09日 22:29:23

Many-To-Many 例子:

创建三张表: 

Person: 

uid uname
1 Jason

Project:

pid pro_name
1 java

Pro_per: 关联person 和 project,表示参与了项目的人。uid 和 pid 为联合主键

pid uid
1 1


ManyToMany:一个人可以参加多个项目,一个项目也可以有多个人参加。

OneToMany的时候用 reverse engineering 可以生成关联的内部数据类型 Set, 但ManyToMany不会生成Set,所以要自己在类里面手写 Set,而且要在hbm.xml 里面自己手写Set 的标签。


Person.java:

package entity;

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

/**
 * Person entity. @author MyEclipse Persistence Tools
 */

public class Person implements java.io.Serializable {

	// Fields

	private Integer uid;
	private String uname;
	private Set projects = new HashSet();

	// Constructors

	/** default constructor */
	public Person() {
	}

	/** full constructor */
	public Person(String uname) {
		this.uname = uname;
	}

	// Property accessors

	public Integer getUid() {
		return this.uid;
	}

	public void setUid(Integer uid) {
		this.uid = uid;
	}

	public String getUname() {
		return this.uname;
	}

	public void setUname(String uname) {
		this.uname = uname;
	}

	public Set getProjects() {
		return projects;
	}

	public void setProjects(Set projects) {
		this.projects = projects;
	}

	
	
}

Project.java:

package entity;

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

/**
 * Project entity. @author MyEclipse Persistence Tools
 */

public class Project implements java.io.Serializable {

	// Fields

	private Integer pid;
	private String proName;
	private Set Persons = new HashSet();

	// Constructors

	/** default constructor */
	public Project() {
	}

	/** full constructor */
	public Project(String proName) {
		this.proName = proName;
	}

	// Property accessors

	public Integer getPid() {
		return this.pid;
	}

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

	public String getProName() {
		return this.proName;
	}

	public void setProName(String proName) {
		this.proName = proName;
	}

	public Set getPersons() {
		return Persons;
	}

	public void setPersons(Set persons) {
		Persons = persons;
	}

}


Person.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">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="entity.Person" table="person" catalog="hibernate_1">
        <id name="uid" type="java.lang.Integer">
            <column name="uid" />
            <generator class="native"></generator>
        </id>
        <property name="uname" type="java.lang.String">
            <column name="uname" />
        </property>
               
        <strong><em><span style="color:#ff0000;"><set name = "projects" table = "pro_per">
        	<key column = "uid">
        	</key>        	     
        	<many-to-many class = "entity.Project"	column = "pid">
        	</many-to-many>
        </set></span></em></strong>
        
    </class>
</hibernate-mapping>



Project.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">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="entity.Project" table="project" catalog="hibernate_1">
        <id name="pid" type="java.lang.Integer">
            <column name="pid" />
            <generator class="native"></generator>
        </id>
        <property name="proName" type="java.lang.String">
            <column name="pro_name" />
        </property>
         
       <span style="color:#ff0000;"> <strong><set name = "persons" table = "pro_per">
        	<key column = "pid">
        	</key>        	     
        	<many-to-many class = "entity.Person"	column = "uid">
        	</many-to-many>
        </set></strong></span>
        
    </class>
</hibernate-mapping>


Test 1: 新建Person("Jason"), 从数据库读出pid=1 的project, 在person的Set 中加入该project,保存person的时候,关联关系也会自动保存到第三张表(Proj_per)里面。


package test;

import org.hibernate.Session;
import org.hibernate.Transaction;
import sessionfactory.HibernateSessionFactory;
import entity.Person;
import entity.Project;

public class Test {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Session s = HibernateSessionFactory.getSession();		
			Project pro = (Project) s.load(Project.class, 1);
			Person per = new Person("Jason");		
			per.getProjects().add(pro);		
			Transaction t = s.beginTransaction();			
				s.save(per);				
			t.commit();
		s.close();		
	}
}

生成的sql 语句:

Hibernate: insert into hibernate_1.person (uname) values (?)
Hibernate: insert into pro_per (uid, pid) values (?, ?)

在Person 和 Pro_per 两个表内都做添加。

Person (增加1-Jason):

uid uname
1 Jason

Project ( 无变化):

pid pro_name
1 java


Pro_per (增加1-1):

pid uid
1 1


同理,也可以load出一个person,添加到新建的一个project的set里,结果在Project 和 Pro_per 两个表里都做添加:

package test;

import org.hibernate.Session;
import org.hibernate.Transaction;

import sessionfactory.HibernateSessionFactory;
import entity.Person;
import entity.Project;

public class Test2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Session s = HibernateSessionFactory.getSession();		
			Person per = (Person)s.load(Person.class, 4);
			Project pro = new Project("iOS");
			pro.getPersons().add(per);		
			Transaction t = s.beginTransaction();		
				s.save(pro);		
			t.commit();
		s.close();
	}
}


Calvin 为 uid = 4 的person 的uname

Person (无变化):

uid uname
... ...
4 Calvin

Project (增加2-iOS):
pid pro_name
1 java
2 iOS

Pro_per (增加2-4):

pid uid
1 1
2 4







hibernate注解版关联映射Many-to-One/Many-to-Many等&异常处理

链接:http://blog.csdn.net/superdog007/article/details/8534443 属性介绍: 1.多对一: span style="font-size:...
  • xn_28
  • xn_28
  • 2017年03月15日 16:12
  • 1771

Hibernate基于注解的双向one-to-many映射关系的实现

在项目中用到了一对多的实体类关系映射,之前接触的都是基于配置文件的映射实现,但是公司的大部分都是基于注解的,因此自己参考之前的代码捣鼓了基于注解的一对多的映射关系实现。 背景: 一的一端:Qing...
  • bruce_6
  • bruce_6
  • 2014年07月23日 11:00
  • 2270

hibernate单向多对多映射(many-to-many)XML与注解版

多对多关联映射需要新增加一张表才完成基本映射,他的实例场景如下: 用户与他的角色(一个用户拥有多个角色,一个角色还可以属于多个用户) 多对多关联映射,需要一个中间表,两个表中的主键放到...
  • u011781521
  • u011781521
  • 2017年05月05日 17:21
  • 835

使用注解的Hibernate one-to-many映射

One to many映射关系指的是两个实体间一个实体可以和多个实体有关联关系,但是多的这一端只能和一的这一端的一个实例有关系。它是一个1 到 n的关系。例如在任何的公司员工可以注册多个银行账户,一个...
  • maoyeqiu
  • maoyeqiu
  • 2015年12月24日 23:32
  • 4194

many-to-one与one-to-many映射文件关于外键的问题

many-to-one与one-to-many映射文件有两个实体——城市与国家,关系为n:1,欲实现关联关系的双向关联城市(City.java)package com.hibernate.beans;...
  • leisure_life
  • leisure_life
  • 2017年03月15日 16:34
  • 879

hibernate学习5之one-to-many双向关联

一对多双向关联映射: * 在一一端的集合上使用,在对方表中加入一个外键指向一一端 * 在多一端采用 ...
  • gundumw100
  • gundumw100
  • 2017年04月10日 17:55
  • 186

one-to-many关系的更新问题

基本配置如下:  Java代码   学生实体               name="selectclasses"               lazy="false"...
  • huangmingleiluo
  • huangmingleiluo
  • 2014年11月14日 09:24
  • 756

Hibernate 学习笔记(三)之基本映射关系详解

单向 n-1映射 双向1-n映射 双向多对多映射 基于外键的1对1映射 基于主键的1对1映射...
  • keYuK0
  • keYuK0
  • 2017年12月31日 11:54
  • 26

MySQL提示“too many connections”的解决办法

今天生产服务器上的MySQL出现了一个不算太陌生的错误“Too many connections”。平常碰到这个问题,我基本上是修改/etc/my.cnf的max_connections参数,然后重启...
  • qq43599939
  • qq43599939
  • 2017年04月03日 20:00
  • 1942

hibernate One2Many级联增删改查

环境:maven普通项目 项目结构 1 pom.xml 4.0.0 com.mycompany learHibernate 0.0.1-SNAPSH...
  • tarenahuangdw
  • tarenahuangdw
  • 2015年12月31日 15:54
  • 1486
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:20150708 MyEclipse Hibernate Many To Many Mapping
举报原因:
原因补充:

(最多只允许输入30个字)