7. 多对一关联映射
来源:互联网 发布:显卡测试软件2016 编辑:程序博客网 时间:2024/06/03 23:01
关联映射的本质:
* 将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用
实例背景:
1. 定义Group类
package com.bjsxt.hibernate;
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;
}
}
2. 定义Group类的映射文件
<?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="com.bjsxt.hibernate.Group" table="t_group">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
3. 定义User类
package com.bjsxt.hibernate;
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;
}
}
4. 定义User类的映射文件
<?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="com.bjsxt.hibernate.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!-- group是数据库的关键字,这里必须定义column属性-->
<many-to-one name="group" column="groupid"/>
</class>
</hibernate-mapping>
注意:<many-to-one>会在多的一端加入一个外键,指向一的一端,这个外键是由<many-to-one>中的column属性定义的,如果忽略了这个属性那么默认的外键与实体的属性一致
5. 定义hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.url">
jdbc:mysql://localhost/hibernate_many2one
</property>
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">bjsxt</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<mapping resource="com/bjsxt/hibernate/User.hbm.xml"/>
<mapping resource="com/bjsxt/hibernate/Group.hbm.xml"/>
</session-factory>
</hibernate-configuration>
6. 定义ExportDB类和HibernateUtils工具类(略)
7. 编写测试用例
package com.bjsxt.hibernate;
import org.hibernate.Session
import junit.framework.TestCase;
public class Many2OneTest extends TestCase {
public void testSave1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
Group group = new Group();
group.setName("尚学堂");
User user1 = new User();
user1.setName("菜10");
user1.setGroup(group);
User user2 = new User();
user2.setName("容祖儿");
user2.setGroup(group);
//不能成功保存,抛出TransientObjectException异常
//因为Group为Transient状态,oid没有分配值
//persistent状态的对象是不能引用transient状态的对象的
//cascade属性可以修正这个问题
session.save(user1);
session.save(user2);
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
public void testSave2() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
Group group = new Group();
group.setName("尚学堂");
session.save(group);
User user1 = new User();
user1.setName("菜10");
user1.setGroup(group);
User user2 = new User();
user2.setName("容祖儿");
user2.setGroup(group);
//可以正确存储
session.save(user1);
session.save(user2);
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
//可以正常加载
public void testLoad() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
User user = (User)session.load(User.class, 3);
System.out.println("user.name=" + user.getName());
System.out.println("user.group.name=" + user.getGroup().getName());
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
}
8. Cascade属性
在<many-to-one>标签中配置cascade属性,可以实现group对象的级联保存或修改或删除
cascade取值: none/save-update/delete/all,默认为none
修改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="com.bjsxt.hibernate.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="group" column="groupid" cascade="all"/>
</class>
</hibernate-mapping>
测试方法如下:
public void testSave3() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
Group group = new Group();
group.setName("尚学堂");
User user1 = new User();
user1.setName("菜10");
user1.setGroup(group);
User user2 = new User();
user2.setName("容祖儿");
user2.setGroup(group);
//不会抛出异常,因为采用了cascade属性,所以它会先保存Group
//采用cascade属性是解决TransientObjectException异常的一种手段
session.save(user1);
session.save(user2);
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
- 7. 多对一关联映射
- 多对一关联映射
- Hibernate关联映射--多对一映射
- Hibernate关联关系映射(多对一关联映射)
- Hibernate多对一单向关联映射
- hibernate多对一关联映射
- 多对一单向关联映射
- hibernate多对一关联映射
- hibernate映射多对一关联
- hibernate:多对一单向关联映射
- hibernate多对一关联映射
- 关联映射----多对一小实例
- hibernate---->多对一关联映射
- 多对一关联的映射
- Hibernate多对一映射单向关联
- hibernate 关联映射 多对一
- Hibernate多对一关联映射(单向)
- 顺藤摸瓜【Nhibernate 关联映射--多对一】
- 企业怎样对CRM实施进行评测
- 解读 LWUIT 之十:画笔(Painters)
- Linux Platform Device and Driver
- 简述C和C++程序员学习历程
- “layer-list” 和 “include”的使用
- 7. 多对一关联映射
- ASCII/Unicode的结合与 STL 的 string 类的方法
- ogles-src-1.0.0 从evc移植到vc6.0
- [转]RHEL5.4 inter pro/wireless 5100 无线问题及解决办法
- 计算机视觉:关于Graph cuts的简介及相关资源
- 海量数据解决方案
- arcgis server for flex安装准备
- linux时钟jiffies及其相关
- 一个运动学逆问题的matlab和C++解决