Room.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 package="com.goby.Hibernate.bean">
<class name="Room" table="t_room">
<id name="id">
<generator class="native"></generator>
</id>
<property name="address"></property>
<!--
constrained(约束) (可选)
表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束。
这个选项影响save()和delete()在级联执行时的先后顺序以及 决定该关联能否被委托(也在schema export
tool中被使用).
-->
<one-to-one name="users" class="User" constrained="true" />
</class>
</hibernate-mapping>
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 package="com.goby.Hibernate.bean">
<class name="User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!--
cascade(级联) (可选) 表明操作是否从父对象级联到被关联的对象。
-->
<many-to-one name="room" class="Room" column="room_id" cascade="all"/>
</class>
</hibernate-mapping>
Test.java
package test;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import junit.framework.TestCase;
import org.hibernate.Session;
import com.goby.Hibernate.bean.HibernateUtils;
import com.goby.Hibernate.bean.Role;
import com.goby.Hibernate.bean.User;
public class test extends TestCase {
public void testSave(){
Session session = null;
try{
session = HibernateUtils.getSession();
session.beginTransaction();
Role role1 = new Role();
role1.setName("manager");
Role role2 = new Role();
role2.setName("officer");
Role role3 = new Role();
role3.setName("normal");
Set roles1 = new HashSet();
roles1.add(role1);
roles1.add(role2);
Set roles2 = new HashSet();
roles2.add(role1);
roles2.add(role3);
User user1 = new User();
user1.setName("goby");
user1.setRoles(roles1);
User user2 = new User();
user2.setName("qq");
user2.setRoles(roles2);
session.save(user1);
session.save(user2);
session.getTransaction().commit();
}catch(Exception ex){
ex.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
/*
* 从User类中获取数据
*/
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());
Set roles = user.getRoles();
for(Iterator iter = roles.iterator();iter.hasNext();){
Role role = (Role)iter.next();
System.out.println("role.name="+role.getName());
}
session.getTransaction().commit();
}catch(Exception ex){
ex.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
/*
* 从Role类中获取数据
*/
public void testload2(){
Session session = null;
try{
session = HibernateUtils.getSession();
session.beginTransaction();
Role role = (Role)session.load(Role.class, 1);
System.out.println("role.name="+role.getName());
Set users = role.getUsers();
for(Iterator iter = users.iterator();iter.hasNext();){
User user = (User)iter.next();
System.out.println("user.name="+user.getName());
}
session.getTransaction().commit();
}catch(Exception ex){
ex.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
}
分享到:
相关推荐
1:1(一对一)关联表示两个实体之间存在一对一的关系,例如一个人对应一张唯一的身份证。在Hibernate中,可以通过`<one-to-one>`标签实现。如示例所示,`Person`类和`IDCard`类之间的关联就是这样设置的。在`Person....
一对一的唯一外键关联,一方的外键字段指向另一方的主键,通过`<one-to-one>`标签的`constrained`属性来指定外键的存在。 以上是Hibernate基本知识的概览,实际使用中还需要结合具体业务需求进行更深入的学习和实践...
Hibernate的一对一关联是当两个实体类之间存在唯一对应的关系,例如一个人只有一个身份证。这种关联可以通过在映射文件中定义`<one-to-one>`标签来实现。在上述案例中,`Person`类与`IDCard`类之间就是1:1关系,...
7. **一对多、一对一和多对多关系映射**:这部分内容将解释如何配置和处理不同类型的关联关系,包括外键映射、集合映射等。 8. **缓存机制**:Hibernate提供了一级缓存和二级缓存,能有效减少数据库访问,提高应用...
- `<one-to-one>`、`<many-to-one>`、`<one-to-many>`和`<many-to-many>`:分别用于一对一、一对多、多对一和多对多的关系映射,通过`<class>`元素的嵌套和属性如`inverse`、`cascade`等来控制关系的维护方式和级联...
Hibernate支持多种关联映射,如一对一、一对多、多对一、多对多。在源码中,开发者可能展示了如何通过XML映射文件或注解配置这些关联,并演示了如何在代码中处理这些关系。 通过分析`hibernate_day02`的源码,我们...
7. **一对多、多对一、一对一和多对多关系映射**:在数据库设计中常见的关联关系,笔记会详细讲解如何在Hibernate中配置和操作这些关系,包括联合主键、外键约束等。 8. **懒加载与立即加载**:Hibernate提供了懒...
这种关联表示“一对一”的关系。在基于外键的1-1关联中,只需在`<many-to-one>`元素上添加`unique="true"`属性。对于基于主键的1-1关联,我们可以使用`<one-to-one>`元素,让两个实体的主键互相引用。 C. 单向1-N...
#### 3.3 一对一关联 - **特点**:一个实体只能与另一个实体关联。 - **实现方式**:可以使用外键或单独的关联表。 #### 3.4 一对多关联 - **特点**:一个实体可以与多个实体关联。 - **实现方式**:通常使用外键。...
在示例中,Person类有一个名为`emails`的集合,它映射到emails表,并通过`<key>`标签指定外键关联。 2. **List**: List是允许重复元素的集合,适合存储可能重复的数据。在数据库中,可以通过增加一个索引字段来区别...
1. 合理设计实体类,避免过多的一对多关系。 2. 使用懒加载以提高性能。 3. 使用事务管理,确保数据一致性。 4. 避免在循环中执行查询,可能导致大量数据库交互。 5. 使用二级缓存,提高应用性能。 6. 谨慎使用级联...
例如,在一对多关系中,配置级联添加后,添加父对象时会自动为关联的子对象设置外键。 ###Hibernate的缓存机制 Hibernate拥有三级缓存:一级缓存是Session级别的,二级缓存是Session Factory级别的,查询缓存是针对...
Student 类的 id 字段与 IdCard 类的 id 字段相同,形成一对一关系。在 Hibernate 映射文件中,通过将 `column` 属性设置为相同的列名,表明它们共享同一主键。而在外键关联中,一方(通常是非主表)拥有指向另一方...