您的位置:首页 > 其它

hibernate中多对多映射配置详细解析

2016-08-10 22:15 337 查看
    本工程以项目与开发人员构成多对多的关系来展开,构建多对多的关系,具体实现代码如下所示:

1.hibernate.cfg.xml文件

<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<!-- 通常,一个session-factory节点代表一个数据库 -->
<session-factory>
<!-- 1.数据库连接配置 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hib-demo</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!--数据库方法配置,hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

<!-- 2.其他相关配置 -->
<!--2.1显示hibernate在运行的时候执行的sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 2.2格式化sql
<property name="hibernate.format_sql">true</property>-->
<!-- 2.3自动建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 3.加载所有映射
<mapping resource="cn/itcast/a_hello/Employee.hbm.xml"/>-->
</session-factory>
</hibernate-configuration>

2.Developer
package cn.itcast.c_many2many;

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

//开发人员信息
public class Developer {
private Integer d_id;//开发人员编号
private String d_name;//开发人员姓名
//开发人员参与的多个项目
private Set<Project> projects=new HashSet<Project>();
public Integer getD_id() {
return d_id;
}
public void setD_id(Integer d_id) {
this.d_id = d_id;
}
public String getD_name() {
return d_name;
}
public void setD_name(String d_name) {
this.d_name = d_name;
}
public Set<Project> getProjects() {
return projects;
}
public void setProjects(Set<Project> projects) {
this.projects = projects;
}

}


3.Project
package cn.itcast.c_many2many;

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

public class Project {
private Integer prj_id;//项目编号
private String prj_name;//项目名称
//项目下的多个员工
private Set<Developer> developers=new HashSet<Developer>();
public Integer getPrj_id() {
return prj_id;
}
public void setPrj_id(Integer prj_id) {
this.prj_id = prj_id;
}
public String getPrj_name() {
return prj_name;
}
public void setPrj_name(String prj_name) {
this.prj_name = prj_name;
}
public Set<Developer> getDevelopers() {
return developers;
}
public void setDevelopers(Set<Developer> developers) {
this.developers = developers;
}

}


4.Developer.hbm.xml

<?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">

<!--

This mapping demonstrates content-based discrimination for the
table-per-hierarchy mapping strategy, using a formula
discriminator.

-->
<!--映射文件:映射一个实体类对象,描述一个对象最终可以直接保存对象数据到数据库中 -->
<!-- package:要映射的对象所在的包(可选,如果不指定,此文件下所有的类都要指定全路径)
auto-import 默认为true,在写HQL的时候自动导入包名
如果指定为false,在写HQL的时候必须要写上类的全名-->
<hibernate-mapping package="cn.itcast.c_many2many">
<class name="Developer" table="t_developer">
<id name="d_id">
<generator class="native"></generator>
</id>
<property name="d_name"></property>

<set name="projects" table="t_relation">
<key column="did"></key>
<many-to-many column="prjId" class="Project"></many-to-many>
</set>

</class>

</hibernate-mapping>


5.Project.hbm.xml
<?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">

<!--

This mapping demonstrates content-based discrimination for the
table-per-hierarchy mapping strategy, using a formula
discriminator.

-->
<!--映射文件:映射一个实体类对象,描述一个对象最终可以直接保存对象数据到数据库中 -->
<!-- package:要映射的对象所在的包(可选,如果不指定,此文件下所有的类都要指定全路径)
auto-import 默认为true,在写HQL的时候自动导入包名
如果指定为false,在写HQL的时候必须要写上类的全名-->
<hibernate-mapping package="cn.itcast.c_many2many">
<class name="Project" table="t_project">
<id name="prj_id">
<generator class="native"></generator>
</id>
<property name="prj_name"></property>

<!-- 多对多映射:
1.映射的集合属性:developers
2.集合属性:对应的中间表,t_relation
3.外键字段:prjid
4.外键字段:对应的中间表字段,did
5.集合属性元素的类型 -->
<set name="developers" table="t_relation">
<key column="prjId"></key>
<many-to-many column="did" class="Developer"></many-to-many>
</set>

</class>

</hibernate-mapping>


6.junit测试

package cn.itcast.c_many2many;

import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.junit.Test;

public class App_save {
private static SessionFactory sf;
static{
sf=new Configuration()
.configure()
.addClass(Project.class)
.addClass(Developer.class) //测试的时候使用
.buildSessionFactory();
}

//多对多数据的保存,只能通过一方维护另一方,不能重复维护!
@Test
public void Save() {
Session session=sf.openSession();
session.beginTransaction();
//创建项目对象
Project prj_ds=new Project();
prj_ds.setPrj_name("电商系统");
Project prj_oa=new Project();
prj_oa.setPrj_name("OA系统");
//创建员工对象
Developer dev_cj=new Developer();
dev_cj.setD_name("刘德华");
Developer dev_wc=new Developer();
dev_wc.setD_name("高园园");
Developer dev_lz=new Developer();
dev_lz.setD_name("王明");
//关系
prj_ds.getDevelopers().add(dev_cj);
prj_ds.getDevelopers().add(dev_wc);//电商系统 :刘德华,高园园
prj_oa.getDevelopers().add(dev_cj);
prj_oa.getDevelopers().add(dev_lz);//OA系统:刘德华,王明
//保存
session.save(dev_cj);
session.save(dev_wc);
session.save(dev_lz);

session.save(prj_ds);
session.save(prj_oa);

session.getTransaction().commit();
session.close();
//得到九条结果
/*Hibernate: insert into t_developer (d_name) values (?)
Hibernate: insert into t_developer (d_name) values (?)
Hibernate: insert into t_developer (d_name) values (?)
Hibernate: insert into t_project (prj_name) values (?)
Hibernate: insert into t_project (prj_name) values (?)
Hibernate: insert into t_relation (prjId, did) values (?, ?)
Hibernate: insert into t_relation (prjId, did) values (?, ?)
Hibernate: insert into t_relation (prjId, did) values (?, ?)
Hibernate: insert into t_relation (prjId, did) values (?, ?)
*/

}

@Test
public void Save2() {
Session session=sf.openSession();
session.beginTransaction();

session.getTransaction().commit();
session.close();

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: