`
KuangYeYaZi
  • 浏览: 52404 次
文章分类
社区版块
存档分类
最新评论

HIBERNATE一对多配置实例

 
阅读更多

HIBERNATE一对多配置实例
1. 环境:假定班级和学生是一对多的关系,班级是一,学生是多,对应表格分别是:zlass ,student
2. 创建Zlass和Student对象

班级实体类:

//Zlass对象---------------------------------------------------------
    public class Zlass{
 
 private String class_id;
 private String class_name;
 private java.util.Set students;
 
 public void setId(String id){
    this.class_id = id;
 }
 
 public void setClassName(String className){
    this.class_name = className;
 }
 
 public void setStudents(java.util.Set students){
    this.students = students;
 }
 
 public String getId(){
    return class_id;
 }
 
 public String getClassName(){
    return class_name;
 }
 
 public java.util.Set getStudents(){
    return students;
 }
 
}

 

学生对象实体类:

//学生对象
public class Student{
       private String student_id;
       private String name;
       private Address address;
       private java.util.Set events;
       private java.util.Set lessons;
       private Zlass zlass;
       
       public Zlass getZlass(){
              return zlass;
       }
 
       public String getStudentId(){
              return student_id;
       }
       
       public String getName(){
              return name;
       }
       
       public Address getAddress(){
              return address;
       }
       
       public java.util.Set getEvents(){
              return events;
       }
       
       public java.util.Set getLessons(){
              return lessons;
       }
 
       public void setZlass(Zlass zlass){
              this.zlass = zlass;
       }
       
       public void setStudentId(String studentId){
              this.student_id = studentId;
       }
       
       public void setName(String name){
              this.name = name;
       }
       
       public void setAddress(Address address){
              this.address = address;
       }
       
       public void setEvents(java.util.Set events){
              this.events =events;
       }
       
       public void setLessons(java.util.Set lessons){
              this.lessons = lessons;
       }
       
}
 

 

 

配置文件:

班级映射文件:

//----------Zlass.hbm.xml---------------
<hibernate-mapping package="com.softWork.school">
 <class name="Zlass" table="class">
    <id name="id" column="id" type="string" length="20">
      <generator class="assigned"/>
    </id>
    <property name="className" column="class_name" type="string" length="200"/>
    
    <set name="students" inverse="false" cascade="all">
      <key column="class_id"/>
      <one-to-many class="Student"/>
    </set>
 </class>
</hibernate-mapping>

 学生实体映射文件:

//-------------Student.hbm.xml---------------
<hibernate-mapping package="com.softWork.school">
 <class name="Student" table="student">
    <id name="studentId" column="student_id" type="string" length="20">
      <generator class="assigned"/>
    </id>
    <property name="name" type="string" length="20"/>
    <component name="address" class="Address">
      <property name="state" column="state" type="string"></property>
      <property name="city" column="city" type="string"></property>
      <property name="street" column="street" type="string"></property>
    </component>
    <set name="events" inverse="false" cascade="all">
      <key column="student_id"></key>
      <one-to-many class="Event"></one-to-many>
    </set>
    
    <set name="lessons" table="student_lesson">
      <key column="student_id"/>
      <many-to-many class="Lesson" column="lesson_id" />
    </set>
    <many-to-one name="zlass" column="class_id" class="Zlass"/>
 </class>
</hibernate-mapping>

 以上使用的是班级一端维护关系,并级连操作

 
3. 使用级连操作数据
1) 新增班级
       Zlass zlass = new Zlass();
       zlass.setId("971002");
       zlass.setClassName("机制97-1班");
       session.saveOrUpdate(zlass);
 2) 为班级新增学生

主动端操作:

Zlass zlass = (Zlass)session.load(Zlass.class,"971002");
 Student student = new Student();
student.setStudentId("005");
student.setName("没名");
zlass.getStudents().add(student);
session.saveOrUpdate(zlass);

 被动端操作:

Zlass zlass = (Zlass)session.load(Zlass.class,"971002");
Student student = new Student();
student.setStudentId("006");
student.setName("006");
student.setZlass(zlass);
session.saveOrUpdate(student);

 3) 删除学生资料

主动端操作:
主动端除非删除自己,并设置了级连才能删除子对象,否则无法完成
//-----以下代码将只删除两者之间的关系,即将学生的class_id设置为null-----

Zlass zlass = (Zlass)session.load(Zlass.class,"971001");
java.util.Iterator iterator = zlass.getStudents().iterator();
if (iterator.hasNext()){
          zlass.getStudents().remove(iterator.next());
     }
session.saveOrUpdate(zlass);

 被动端操作:

Student student = (Student)session.load(Student.class,"002");
session.delete(student);

 4) 修改学生资料

通过班级修改学生资料

Zlass zlass = (Zlass)session.load(Zlass.class,"971002");
      java.util.Iterator iterator = zlass.getStudents().iterator();
      if (iterator.hasNext()){
            Student student = (Student)iterator.next();
            student.setName("名字已修改");
      }
session.saveOrUpdate(zlass);

 读取返回的Set型数据:

java.util.Set set = student.getEvents();
java.util.Iterator iterator = set.iterator();
while(iterator.hasNext()){
    evt = (Event)iterator.next();
    System.out.println(evt.getContent());
    System.out.println(evt.getDate().toString());
}

 4. 注意:

如果需要从多放引导到一方,需要在一方配置文件中设置inverse=”true”参数,以设定一方到多方的设定是逆向映射,对关联的逆向端所做的修改将不会被持久化。
Inverse=”true”的表示两个实体的关系由对方去维护。
5. 推荐配置,一般的将”一”这一端设置为inverse=”false”,cascade=”all” ,这样一般的操作只需要在”一”这一端操作,此适合于标志性一对多的情况,如销售单和销售明细
如果是非标志性一对多,则一般的将inverse=”false”,cascade=”none”,这样关系永远在主动一端进行控制
示范:假如A对B是一对多,当A中原来有B1,B2,B3,当A中的集合中只包含B1,B2时,那么B中B3的外码将被设置为NULL,这个是CASCADE=“FALSE”的情况下的结果。

 

 

以上来源:http://hi.baidu.com/sj060402245/item/c0de11cf6ba9910cc710b23b

分享到:
评论

相关推荐

    hibernate一对多、多对一、一对一、多对多配置实例

    NULL 博文链接:https://lichaobao.iteye.com/blog/1977048

    hibernate包的详解以及关系配置实例

    本文档主要介绍hibernate主要包的作用,还有如何使用HQL查询,事务管理的详解,以及一对一、多对多、一对多、多对一关系的配置实例。还有配置文件中的各个属性的作用说明。

    hibernate 体系结构与配置 参考文档(html)

    一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在...

    Hibernate3.1_学习源码

    案例目录: 01 01Hibernate_Handwork : 手工配置使用Hibernate,其中详细标了Hibernate进行持久化的一些过程,因为是Hibernate的入门实例,所以注释很详细,其中有... 一对一、多对一、一对多、多对多等几种情况。

    整合jsf hibernate spring实例

    部门人员一对多的CRUD操作 hibernate: 管理实体关系映射 spring:数据源配置与获得session IOC依赖注入 和 AOP 事务管理 jsf : backing bean的操作 jsf 标签应用 jsf 信息国际化以资源绑定 jsf 表单验证 jsf ...

    Hibernate+中文文档

    7.4.1. 一对多(one to many) / 多对一(many to one) 7.4.2. 一对一(one to one) 7.5. 使用连接表的双向关联(Bidirectional associations with join tables) 7.5.1. 一对多(one to many) /多对一( many ...

    HibernateAPI中文版.chm

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) ...

    hibernate3.2中文文档(chm格式)

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) ...

    hibernate注解式代码应用

    重点包括一对一,一对多及多对多关系的配置代码实例。 myeclipse项目工程导入即可运行(需要自行导入hibernat4.1.4包依赖(myeclipse中自带此包))。每个实例均附说明及mysql的库表sql。另,如果要测试代码中的hbm2...

    Hibernate中文详细学习文档

    7.4.1. 一对多(one to many) / 多对一(many to one) 7.4.2. 一对一(one to one) 7.5. 使用连接表的双向关联(Bidirectional associations with join tables) 7.5.1. 一对多(one to many) /多对一( many ...

    最全Hibernate 参考文档

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在集合中出现的依赖对象 ...

    Hibernate 中文 html 帮助文档

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在...

    Hibernate教程

    8.5.1. 一对多(one to many) /多对一( many to one) 8.5.2. 一对一(one to one) 8.5.3. 多对多(many to many) 9. 组件(Component)映射 9.1. 依赖对象(Dependent objects) 9.2. 在集合中出现的依赖...

    Hibernate体系结构的概要图

    在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。 Transaction接口  Transaction接口负责事务相关的操作。它是可选的,开发人员也可以设计编写自己...

    hibernate 教程

    一对多关联(One-To-Many Associations) 6.5. 延迟初始化(延迟加载)(Lazy Initialization) 6.6. 集合排序(Sorted Collections) 6.7. 使用&lt;idbag&gt;&lt;br&gt;6.8. 双向关联(Bidirectional Associations)...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) ...

    hibernate代码介绍,与数据库的关系

    hibernate代码,Hibernate介绍与实例,Hibernate介绍与实例,XML配置文件(一对多),通过Session与数据库交互,XML配置文件(多对多),数据库操作代码

    Hibernate注释大全收藏

    这种策略支持双向的一对多关联,但不支持 IDENTIFY 生成器策略,因为ID必须在多个表间共享。一旦使用就不能使用AUTO和IDENTIFY生成器。 每个类层次结构一张表 @Entity @Inheritance(strategy=InheritanceType....

    (3.0版本)自己写的struts2+hibernate+spring实例

    这次索性写个多对多关系好了.打算写个权限系统好了.我就使用权限5张表.用户表,权限表.角色表.用户角色表和角色菜单表.(麻雀虽小...五脏俱全了啊...)当然这个写起来就费劲一些了.... 为了能够更好的使用各方面的...

    springmvc+jpa(hibernate实现)+spring整合实例

    网上这种整合实例很少,就奉献出来大家一起学习吧,在整合过程中遇到一个很奇怪的问题,就是spring的事务我配置成@Transactional(readOnly = true)只读事务,但是还可以对数据库进行操作,大家如果知道原因的就一起...

Global site tag (gtag.js) - Google Analytics