`
newleague
  • 浏览: 1471676 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

hibernate实例简析-hibernate_many2one

阅读更多
hibernate多对一关联映射

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

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

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

理解级联的含义?
* 是对象的连锁操作
===
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状态,groupid没有分配值
//persistent状态的对象是不能引用transient状态的对象的
session.save(user1);
session.save(user2);
---
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);
---
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);
===
<hibernate-mapping>
<class name="com.bjsxt.hibernate.Group" table="t_group">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
---
<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"/>
-->
<many-to-one name="group" column="groupid"/>
</class>
</hibernate-mapping>
===
public class User {

private int id;

private String name;

private Group group;
---
public class Group {

private int id;

private String name;
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics