欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

多对一关联映射

程序员文章站 2022-04-15 22:13:36
...
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);
}
}

}