您的位置:首页 > 其它

hibernate关联映射

2010-09-25 11:00 253 查看
关联映射的本质:
* 将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用
一.多对一关联映射(单向)
<many-to-one>会在多的一端加入一个外键,指向一的一端,这个外键是由<many-to-one> 中的column属性定义的,如果忽略了这个属性那么默认的外键与实体的属性一致
<many-to-one>标签的定义示例:
<many-to-one name="group" column="groupid" cascade="all"/> 其中<many-to-one>的cascade属性name是多指向一的对象 column指对应一的一端的id

级联的含义:对象的联动操作,对一个对象执行一个操作后,对其指定的级联对象执行相同的操作

可以取值

all:所有情况下执行级联操作

none:在所有情况下都不执行级联操作

save-update :在保存和更新的时候执行级联操作

delete:在删除的时候执行级联操作

例子:用户和组
多个用户对应一个组,一个组里面有多个用户

实体类:User.java

public class User {

private int id;

private String name;

private Group group;//该对象所属的组

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 Group getGroup() {
return group;
}

public void setGroup(Group group) {
this.group = group;
}

}

实体类:Group.java

public class Group {

private int id;

private String name;

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;
}
}
映射文件User.hibernate.xml

<?xml 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="User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!--
<many-to-one name="group" column="groupid" cascade="all"/>
-->
<many-to-one name="group" column="groupid"/>
</class>
</hibernate-mapping>

保存的时候先有Group对象 或者是配置cascade属性

二.多对多关联映射(单向)

用户和角色

User类:

private int id;

private String name;

private Set roles;

映射文件:User.hbm.xml

<?xml 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="User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="roles" table="t_user_role">
<key column="userid"/>
<many-to-many class="Role" column="roleid"/>
</set>
</class>
</hibernate-mapping>

单元测试:
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import org.hibernate.Session;

import junit.framework.TestCase;

public class Many2Many extends TestCase {

public void testSave2() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();

Role r1 = new Role();
r1.setName("数据录入人员");
session.save(r1);

Role r2 = new Role();
r2.setName("商务主管");
session.save(r2);

Role r3 = new Role();
r3.setName("大区经理");
session.save(r3);

User u1 = new User();
u1.setName("10");
Set u1Roles = new HashSet();
u1Roles.add(r1);
u1Roles.add(r2);
u1.setRoles(u1Roles);

User u2 = new User();
u2.setName("祖儿");
Set u2Roles = new HashSet();
u2Roles.add(r2);
u2Roles.add(r3);
u2.setRoles(u2Roles);

User u3 = new User();
u3.setName("杰伦");
Set u3Roles = new HashSet();
u3Roles.add(r1);
u3Roles.add(r2);
u3Roles.add(r3);
u3.setRoles(u3Roles);

session.save(u1);
session.save(u2);
session.save(u3);

session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}

public void testLoad1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
User user = (User)session.load(User.class, 1);
System.out.println(user.getName());
for (Iterator iter=user.getRoles().iterator(); iter.hasNext();) {
Role role = (Role)iter.next();
System.out.println(role.getName());
}
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}

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