`
juforg
  • 浏览: 45773 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

(转)Hibernate映射多对一单向关联(之二)

阅读更多
前提:在 Hibernate映射多对一单向关联(之一) 中配置的映射文件的基础上。
看一下级联更新,其实和插入是一致的。但是这里面有几点需要特别注意。
student表和teacher表都有一个自增长的id。
student表中的一条记录为id=20,sno=200802,sname=Shirdrn;
teacher表中的一条记录为id=1,tname=王老师。
执行级联更新的测试程序这样写:
package org.shirdrn.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.shirdrn.HibernateSessionFactory;
import org.shirdrn.entity.Student;
import org.shirdrn.entity.Teacher;
public class MyTest {
public static void main(String[] args){
   Session session = HibernateSessionFactory.getSession();
   Transaction tx = null;
   try{
    tx = session.beginTransaction();
    Student stu = new Student();
    stu.setId(new Integer(20));
    stu.setSno("2008002");
    stu.setSname("关羽");
    Teacher t = new Teacher();
    t.setId(new Integer(1));
    t.setTname("张老师");
    stu.setTeacher(t);
    session.update(stu);
    tx.commit();
   }
   catch(Exception e){
    tx.rollback();
    e.printStackTrace();
   }
   finally{
    HibernateSessionFactory.closeSession();
   }
}
}
执行结果,控制台提示:
Hibernate: update student set sno=?, sname=?, dept=? where id=?
Hibernate: update hibernate.dbo.teacher set tname=? where id=?
可见级联更新成功。
但是,如果我们只是指定了Student的id,但是忘记了指定Teacher的id,即上面程序中没有t.setId(new Integer(1));的设置,则显然可以想到会是怎样的结果:
Hibernate: insert into hibernate.dbo.teacher (tname) values (?) select scope_identity()
Hibernate: update student set sno=?, sname=?, dept=? where id=?
student表当然执行的是更新操作,而teacher表没有指定id,则执行过程中认为对teacher表的操作是insert操作,故而得到一个插入一个更新的结果。

看一下删除操作:
只有这样才可以成功删除学生的记录。package org.shirdrn.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.shirdrn.HibernateSessionFactory;
import org.shirdrn.entity.Student;
import org.shirdrn.entity.Teacher;
public class MyTest {
public static void main(String[] args){
   Session session = HibernateSessionFactory.getSession();
   Transaction tx = null;
   try{
    tx = session.beginTransaction();
    Student stu = new Student();
    stu.setId(new Integer(19));
    stu.setSno("2008001");
    stu.setSname("shirdrn");
    session.delete(stu);
    tx.commit();
   }
   catch(Exception e){
    tx.rollback();
    e.printStackTrace();
   }
   finally{
    HibernateSessionFactory.closeSession();
   }
}
}
在控制台上看到执行结果:
Hibernate: delete from student where id=?
我建的那个表id是自增长的,而且sno和sname都不能为空,所以删除必须把这些字段都指定,否则就会报异常:
org.hibernate.PropertyValueException: not-null property references a null or transient value: org.shirdrn.entity.Student.sname
at org.hibernate.engine.Nullability.checkNullability(Nullability.java:72)
at org.hibernate.event.def.DefaultDeleteEventListener.deleteEntity(DefaultDeleteEventListener.java:205)
at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:109)
at org.hibernate.impl.SessionImpl.delete(SessionImpl.java:579)
at org.shirdrn.test.MyTest.main(MyTest.java:23)
因为这和我的表的设置有关。试想,id为主键,不同,所以学生的记录(包括sno,sname)可以相同。

看一下级联删除操作:
程序如下:
package org.shirdrn.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.shirdrn.HibernateSessionFactory;
import org.shirdrn.entity.Student;
import org.shirdrn.entity.Teacher;
public class MyTest {
public static void main(String[] args){
   Session session = HibernateSessionFactory.getSession();
   Transaction tx = null;
   try{
    tx = session.beginTransaction();
    Student stu = new Student();
    stu.setId(new Integer(27));
    stu.setSno("2008007");
    stu.setSname("关小羽");
    Teacher t = new Teacher();
    t.setId(new Integer(4));
    t.setTname("王老师");
    stu.setTeacher(t);
    session.delete(stu);
    tx.commit();
   }
   catch(Exception e){
    tx.rollback();
    e.printStackTrace();
   }
   finally{
    HibernateSessionFactory.closeSession();
   }
}
}
如果在上面配置文件的前提下执行删除操作,则会只是删除指定的学生的记录,控制台结果如下所示:
Hibernate: delete from student where id=?
如果想要能够实现级联操作,可以修改Student.hbm.xml中的配置,只需要把cascade="save-update"改成:
cascade="all"
这时,不仅可以级联存储更新,删除也可以级联实现,控制台上打印出来:
Hibernate: delete from student where id=?
Hibernate: delete from hibernate.dbo.teacher where id=?
如果,在SQL Server 2000中没有指定表student和teacher表之间的约束的前提下,insert、update、delete操作都可以对两个表单独进行操作。
分享到:
评论

相关推荐

    hibernate多对一单向关联关系实现源码

    在Java的持久化框架Hibernate中,多对一(ManyToOne)关联关系是一种常见的对象关系映射(ORM)场景。这种关系通常出现在一个实体类拥有多条与另一个实体类相关的记录,而另一个实体类可能只有一条对应的记录。例如...

    hibernate关联映射详解

    包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。

    Hibernate一对一主键关联映射(单向关联)

    总结来说,Hibernate中的一对一主键关联映射允许两个实体共享同一个主键,实现单向关联时只需在依赖方添加对另一方的引用。在实际应用中,应根据业务需求谨慎选择关联类型,以确保数据的完整性和一致性。

    hibernate 单向多对多关联映射练习

    本练习主要关注的是Hibernate中的单向多对多关联映射,这是一种常见的关系数据库设计模式,用于表示两个实体间复杂的关系。 在多对多关联中,两个实体类可以相互拥有多个实例,但只在一个方向上建立关联。例如,...

    Hibernate教程10_关系映射之多对一单向关联

    本教程主要聚焦于Hibernate中的一个关键概念——关系映射,特别是多对一单向关联的实现。这种关联类型常出现在数据库设计中,比如一个部门可以有多名员工,但一个员工只属于一个部门。 首先,我们要理解多对一关系...

    hibernate主键实现一对一单向关联关系源码

    本主题将深入探讨如何使用Hibernate通过主键来实现一对一的单向关联关系,并提供相关的源码分析。 首先,我们需要理解一对一关联关系的基本概念。在数据库中,一对一关系意味着两个表中的每一条记录都对应另一表中...

    Hibernate一对多单向关联映射

    本篇主要探讨的是如何在Hibernate中实现一对多的单向关联映射。 一、概念理解 一对多关联意味着一个实体(如部门)可以有多个关联实体(如员工),而反过来,每个员工只属于一个部门。单向关联则表示只有部门知道其...

    Hibernate一对一唯一外键关联映射(单向关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的关系数据库模型映射方式之一。本文将详细解析如何实现一对一唯一外键(Uniquely Foreign Key,UFK)关联映射,特别是在单向关联的情况下的具体...

    hibernate一对多关联映射(单向关联)

    这篇博客文章“hibernate一对多关联映射(单向关联)”将深入讲解如何配置和使用这种映射关系。 在单向关联中,只有一个实体知道另一个实体的存在,也就是说,只有父实体("一"的一端)有对子实体("多"的一端)的...

    Hibernate 一对一外键单向关联

    本篇文章将深入探讨Hibernate中的一对一外键单向关联。 首先,一对一外键关联指的是一个实体通过外键直接引用另一个实体的主键。在单向关联中,只有其中一个实体知道另一个实体的存在,而另一个实体则无感知。这种...

    Hibernate教程04_关系映射之一对一单向外键关联

    **标题详解:**“Hibernate教程04_关系映射之一对一单向外键关联” 在Hibernate框架中,关系映射是数据库表之间的关联在对象模型中的体现。本教程重点讲解了一对一(One-to-One)单向外键关联的实现方法。在数据库...

    hibernate单向一对多关联映射(注解版)

    在Java的持久化框架Hibernate中,单向一对多关联映射是常见的数据关系处理方式,尤其是在处理数据库中的实体类和表之间的关系时。本主题主要关注如何使用注解来实现这种映射。Hibernate通过注解使得对象关系映射...

    Hibernate双向一对一关联映射(注解版)

    在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有另一个实体的引用,而双向一对一映射则意味着两个实体都可以互相引用。这种关联关系在数据库层面通常通过主键外键约束来实现,但...

    Hibernate学习:单向多对一关联 工程

    本项目“Hibernate学习:单向多对一关联 工程”专注于讲解Hibernate中的单向多对一关联映射,这是数据库设计中常见的关系类型,尤其在处理具有层次结构的数据时。 单向多对一关联指的是在一个实体类中有一个引用,...

    hibernate多对多关联映射(单项关联)

    总的来说,这篇博客和相关代码示例为开发者提供了一个理解和实现Hibernate中多对多单向关联的起点,帮助他们更好地处理复杂的数据库关系映射。学习和实践这部分内容对于提升Java后端开发能力,特别是使用Hibernate...

    Hibernate基于外键的一对多单向关联

    “Hibernate基于外键的一对多单向关联”这个标题指的是在Java持久化框架Hibernate中,如何通过外键实现一个实体类(如订单)与另一个实体类(如商品)之间的一对多关系,并且这种关联是单向的,即从订单端可以访问到...

    Hibernate 一对多外键单向关联

    在Java持久化框架Hibernate中,一对多外键单向关联是一种常见的关系映射方式,它描述了一对多的关系,其中一个实体(例如Person)可以与多个其他实体(例如Address)相关联,而关联的方向只从多方(Address)指向...

Global site tag (gtag.js) - Google Analytics