20150708 MyEclipse Hibernate Many To Many Mapping

本文介绍了一种通过中间关联表实现Many-To-Many关系的方法,并提供了具体的Java实体类及Hibernate映射文件示例,展示了如何在项目和人员之间建立多对多的关系。
部署运行你感兴趣的模型镜像

Many-To-Many 例子:

创建三张表: 

Person: 

uiduname
1Jason

Project:

pidpro_name
1 java

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

pid uid
11


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):

uiduname
1Jason

Project ( 无变化):

pidpro_name
1java


Pro_per (增加1-1):

piduid
11


同理,也可以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 (无变化):

uiduname
......
4Calvin

Project (增加2-iOS):
pidpro_name
1java
2iOS

Pro_per (增加2-4):

piduid
11
24







您可能感兴趣的与本文相关的镜像

Kotaemon

Kotaemon

AI应用

Kotaemon 是由Cinnamon 开发的开源项目,是一个RAG UI页面,主要面向DocQA的终端用户和构建自己RAG pipeline

## 软件功能详细介绍 1. **文本片段管理**:可以添加、编辑、删除常用文本片段,方便快速调用 2. **分组管理**:支持创建多个分组,不同类型的文本片段可以分类存储 3. **热键绑定**:为每个文本片段绑定自定义热键,实现一键粘贴 4. **窗口置顶**:支持窗口置顶功能,方便在其他应用程序上直接使用 5. **自动隐藏**:可以设置自动隐藏,减少桌面占用空间 6. **数据持久化**:所有配置和文本片段会自动保存,下次启动时自动加载 ## 软件使用技巧说明 1. **快速添加文本**:在文本输入框中输入内容后,点击"添加内容"按钮即可快速添加 2. **批量管理**:可以同时编辑多个文本片段,提高管理效率 3. **热键冲突处理**:如果设置的热键与系统或其他软件冲突,会自动提示 4. **分组切换**:使用分组按钮可以快速切换不同类别的文本片段 5. **文本格式化**:支持在文本片段中使用换行符和制表符等格式 ## 软件操作方法指南 1. **启动软件**:双击"大飞哥软件自习室——快捷粘贴工具.exe"文件即可启动 2. **添加文本片段**: - 在主界面的文本输入框中输入要保存的内容 - 点击"添加内容"按钮 - 在弹出的对话框中设置热键和分组 - 点击"确定"保存 3. **使用热键粘贴**: - 确保软件处于运行状态 - 在需要粘贴的位置按下设置的热键 - 文本片段会自动粘贴到当前位置 4. **编辑文本片段**: - 选中要编辑的文本片段 - 点击"编辑"按钮 - 修改内容或热键设置 - 点击"确定"保存修改 5. **删除文本片段**: - 选中要删除的文本片段 - 点击"删除"按钮 - 在确认对话框中点击"确定"即可删除
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值