学习目标:
1、搭建Hibernate环境
2、理解Hibernate的运行流程
3、能正确运行Hibernate的第一个例子
学习过程:
无可否认多对多的配置应该是最简单的,在数据库中多对多需要一个中间表,在hibernate中你可以使用多对多的标签配置这种关系,当然你也可以使用一对多的关系去维护也是可行的,这个就要看具体情况了,毕竟多对多也是依赖一对多的方式实现的。这节课我们就讲讲如何配置多对多,这种配置就让双方的表维护这种关系,在设计pojo类的时候就不需要为中间表专门设计一个对象。
1、修改pojo属性
在表设计中,帐号和角色之间就是多对多的关系,肯定需要使用集合来描述他们之间的关系,所有修改账号和角色两个pojo类,分别添加Set集合属性。
账号类如下:
public class Login implements java.io.Serializable {
private Integer loginId;
private Employee employee;// 一对一
private String loginName;
private String loginPass;
private Set<Role> roles=new HashSet<Role>();//多对多
角色类如下:
public class Role implements java.io.Serializable {
private Integer roleId;
private String roleName;
private Set<Login> logins = new HashSet<Login>();//多对多
..... 省去get/set
}
2、修改映射文件
新建Role.hbm. 如下:
<? version=\"1.0\"?>
<!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.javadayup.stuormrelate.Role\" table=\"role\" catalog=\"hbm_db\">
<id name=\"roleId\" type=\"java.lang.Integer\">
<column name=\"role_id\" />
<generator class=\"native\" />
</id>
<property name=\"roleName\" type=\"java.lang.String\">
<column name=\"role_name\" length=\"200\" />
</property>
<set name=\"logins\" table=\"login_role\" inverse=\"true\">
<key column=\"role_id\"></key>
<many-to-many column=\"login_id\" class=\"com.javadayup.stuormrelate.Login\"></many-to-many>
</set>
</class>
</hibernate-mapping>
修改Login.hbm. ,添加一下代码
<set name=\"roles\" table=\"login_role\" >
<key column=\"login_id\"></key>
<many-to-many column=\"role_id\" class=\"com.javadayup.stuormrelate.Role\"></many-to-many>
</set>
3、测试
public class Run3 {
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
Login login=new Login();
login.setLoginName(\"new\");
login.setLoginPass(\"123\");
Employee employee=new Employee();
employee.setEmployeeId(8);
login.setEmployee(employee);
Set<Role> roles=new HashSet<Role>();
Role role1=new Role();
role1.setRoleId(1);
Role role2=new Role();
role2.setRoleId(2);
roles.add(role2);
roles.add(role1);
login.setRoles(roles);
// 开启一个事务
session.beginTransaction();
// 操作数据库 直接操作对象 持久化
session.save(login);
// 提交事物
session.getTransaction().commit();
session.close();
HibernateUtil.getSessionFactory().close();
}
}
虽然我们只是添加了一个Login信息,但是因为和员工和角色都已经有关系了,所以hibernate帮我们做了很多操作。包括中间包也已经帮我们建立了。查看一下输出的sql
Hibernate: create table hbm_db.role (role_id integer not null auto_increment, role_name varchar(200), primary key (role_id)) type=MyISAM
Hibernate: create table login_role (login_id integer not null, role_id integer not null, primary key (login_id, role_id)) type=MyISAM
Hibernate: alter table hbm_db.employee add constraint FKcm3b9d5fiw8s6co7lkw8c0lbs foreign key (post_id) references hbm_db.post (post_id)
Hibernate: alter table hbm_db.login add constraint FKrf9u9o9lttvq3jevsf6t8svp2 foreign key (employee_id) references hbm_db.employee (employee_id)
Hibernate: alter table login_role add constraint FK63kgx3alku7oht20p6r560u95 foreign key (role_id) references hbm_db.role (role_id)
Hibernate: alter table login_role add constraint FK9bqlp09e2a52fdq1ywjha2iti foreign key (login_id) references hbm_db.login (login_id)
Hibernate: insert into hbm_db.login (login_name, login_pass, employee_id) values (?, ?, ?)
Hibernate: insert into login_role (login_id, role_id) values (?, ?)
Hibernate: insert into login_role (login_id, role_id) values (?, ?)
public class Run4 {
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
Login login=new Login();
login.setLoginId(4);
login.setLoginName(\"abcdef\");
login.setLoginPass(\"abc\");
Employee employee=new Employee();
employee.setEmployeeId(8);
login.setEmployee(employee);
Set<Role> roles=new HashSet<Role>();
Role role1=new Role();
role1.setRoleId(1);
roles.add(role1);
login.setRoles(roles);
// 开启一个事务
session.beginTransaction();
// 操作数据库 直接操作对象 持久化
session.update(login);
// 提交事物
session.getTransaction().commit();
session.close();
HibernateUtil.getSessionFactory().close();
}
}
我们再测试一下执行更新的操作。
Hibernate: update hbm_db.login set login_name=?, login_pass=?, employee_id=? where login_id=?
Hibernate: delete from login_role where login_id=?
Hibernate: insert into login_role (login_id, role_id) values (?, ?)
可以看到他会先执行一下delete,清空了所有的关系,然后再重新insert进去的。
继续阅读与本文标签相同的文章
工具类之JsonUtils
-
解读《运维知识体系》,直面自动化运维的“灵魂八问”
2026-05-18栏目: 教程
-
阿里99大促 | 模型识别背后的样本生成
2026-05-18栏目: 教程
-
Python快递鸟API接口对接(即时查询|物流跟踪|电子面单|单号识别)
2026-05-18栏目: 教程
-
免费物流快递单号查询API接口及使用教程
2026-05-18栏目: 教程
-
【译】Hadoop发生了什么?我们该如何做?
2026-05-18栏目: 教程
