多对一关联映射

hibernate多对一关联映射

关联映射的本质:
* 将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用

<many-to-one>会在多的一端加入一个外键,指向一的一端,这个外键是由<many-to-one>
中的column属性定义的,如果忽略了这个属性那么默认的外键与实体的属性一致

<many-to-one>标签的定义示例:
* <many-to-one name="group" column="groupid"/>

理解级联的含义?
* 是对象的连锁操作
//Group.hbm.xml
<hibernate-mapping>
<class name="com.bjsxt.hibernate.Group" table="t_group">
<id name="id">
<generator class="native"/>
</id>
<property name="name" length = "10"/>
</class>
</hibernate-mapping>


//User.hbm.xml
<hibernate-mapping>
<class name="com.bjsxt.hibernate.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name" length = "10"/>
<!-- cascade级联属性,对删除、更新、保存、修改起作用,保存该对象时级联先保存其他对象 -->
<many-to-one name="group" column="groupid" cascade="all"/>
<!-- 多对一标签,在表中添加groupid字段,groupid作为外键参照t_group表 -->
<!--<many-to-one name="group" column="groupid"/>
--></class>
</hibernate-mapping>
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;
}

}


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;
}
}
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(暂时的)状态,id没有分配值
// persistent状态的对象是不能引用transient状态的对象的
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("尚学堂");// 瞬时对象,还没被保存,transient状态

session.save(group); // 先save,转为persistent状态

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 testSave3() {// 采用了cascade属性
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);
}
}

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

User user = (User) session.load(User.class, 4); //加载ID为4的user
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);
}
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值