举一个很简单的例子,我们经常会在一些论坛中看到关于用户角色的管理,那么,可以有很多User(用户)来对应一个Rose(角色),这样,就形成了多对一关系。
在这个例子中,我们开始使用hibernate3.6系列的api,因为,技术现在不停的更新中,尽管hibernate3.6的版本中可能会存在其他人说的bug之类的,但是,我们需要做的是规范化编程,严格按照api的规范来,逐步探究hibernate的使用
一、导入的jar文件
1、hibernate包
2、commons-logging包
3、commons-collections包
4、cglib包
5、asm包
6、asm-commons包
7、log4包
8、jta包
9、dom4j包
10、数据库的驱动包
11、javassist-3.12.0.GA包
12、slf4-api包
13、slf4-nop包
14、hibernate-jpa-2.0-api
二、在hibernate.cfg.xml中配置信息,参考上一篇中详细的描述
三、创建java实体bean——持久化类
Role.java类
public class Role {
private int id;
private String name;
private Set users;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set getUsers() {
return users;
}
public void setUsers(Set users) {
this.users = users;
}
}
User.java
public class User {
private int id;
private String name;
//在持久化类中,将所依赖的Role封装为一个对象,在数据库中的值是Role的id
private Role role;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
}
四、持久化类的配置文件
<class name="User" table="t_user" lazy="true">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name" type="string" length="50"></property>
<!-- 用于配置多对一关系 ,在数据库中的字段名是roleid -->
<!-- cascade级联操作,持久化操作会从t_role表中级联到t_user表中 -->
<many-to-one name="role" column="roleid" cascade="all">
</many-to-one>
</class>
<class name="Role" table="t_role" lazy="true">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name" type="string" length="50"></property>
</class>
五、测试程序代码
Session session=HibernateTools.getSession();
session.beginTransaction();
//Transient
Role role=new Role();
role.setName("vip");
//Transient->Persistent
session.save(role);
User user1=new User();
user1.setName("张三三1");
user1.setRole(role);
User user2=new User();
user2.setName("张三三2");
user2.setRole(role);
//Persistent
session.save(user1);
session.save(user2);
session.getTransaction().commit();
六、双向多对一
以上是单向的多对一关系,现在看一下双向多对一关系,双向多对一和双一对多是完全相同的两种情况
<class name="User" table="t_user" lazy="true">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name" type="string" length="50"></property>
<!-- 数据库底层通过在N的一方加一个外间约束来描述这种关系 -->
<many-to-one name="role" column="roleid" cascade="all"></many-to-one>
</class>
<class name="Role" table="t_role" lazy="true">
<id name="id" length="20">
<generator class="native"></generator>
</id>
<property name="name" type="string" length="50"></property>
<!-- 对于双向多对一的关系,同城不应该允许1的一段控制关联关系,而应该由N的一段来控制关联关系 此时, 在<set...>元素中指定inverse="true",用于指定1的一段不控制关联关系 -->
<set name="users" inverse="true">
<key column="roleid"></key><!--装载一个集合,通过roleid进行关联 -->
<one-to-many class="User"/>
</set>
</class>
以上是简单的程序,供大家测试
转载请注明出处 http://blog.csdn.net/di1nuli/article/details/7083800