实体类
Student.java
public class Student { private int id; private String name; private String no; private ClassRoom classroom; 省略get,set }
ClassRoom.java
public class ClassRoom { private int id; private String name; private int grade; private Set<Student> stus;//在oneToMany时,在多的一方建立外键,而一的一方表现形式是set<>那个对象的 集合 省略get,set }
hbm文件
Student.hbm.xml
<hibernate-mapping package="org.th.model"> <class name="Student" table="t_student" > <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> <property name="no"></property> <!--many-to-one 用来映射多对一, 那么表示对象中属性名称, column用来表示外键的名称 --> <!-- 当设置了cascade的时候,会自动完成关联。如果添加时没有关联对象 ,会自动创建一个关联对象 最佳实践:如果没有特殊情况不要使用cascade,特别注意:可能使用cascade的地方一般是一的一方进行删除时使用 特殊需求才会使用cascade的add,正常情况的add都是程序员自己完成添加 --> <many-to-one name="classroom" column="cid" cascade="all" ></many-to-one> </class> </hibernate-mapping>
ClassRoom.hbm.xml
<hibernate-mapping package="org.th.model"> <class name="ClassRoom" table="t_classroom"> <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> <property name="grade"></property> <!-- inverse=true表示不再自己这一端维护关系 --> <set name="stus" lazy="extra" inverse="true"> <key column="cid" /> <one-to-many class="Student" /> </set> </class> </hibernate-mapping>
测试类:
/** * * @Title: testAdd01 * @Description: 先添加1的,在添加多的 * @param * @return void 返回类型 * @throws */ @Test public void testAdd01() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); // 先添加ClassRoom ClassRoom c = new ClassRoom(); c.setName("java高级班"); c.setGrade(10); session.save(c); Student s = new Student(); s.setName("猪八戒"); s.setNo("001"); s.setClassroom(c); session.save(s); Student s2 = new Student(); s2.setName("孙悟空"); s2.setNo("002"); s2.setClassroom(c); session.save(s2); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if (session != null) session.getTransaction().rollback(); } finally { if (session != null) HibernateUtil.close(session); } } /** * * @Title: testAdd02 * @Description:先添加多的,在添加1的 * @param * @return void 返回类型 * @throws */ @Test public void testAdd02() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); Student s = new Student(); s.setName("煞神"); s.setNo("003"); session.save(s); Student s2 = new Student(); s2.setName("唐僧"); s2.setNo("004"); session.save(s2); ClassRoom c = new ClassRoom(); c.setName("java高级班"); c.setGrade(10); session.save(c); // 上面会发出三条新增sql // 此时还会两条update s.setClassroom(c); s2.setClassroom(c); // 最佳实践:一定要先添加一的一方,之后再添加多的一方 session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if (session != null) session.getTransaction().rollback(); } finally { if (session != null) HibernateUtil.close(session); } } /** * * @Title: testAdd02 * @Description: student的关联对象classroom也是延迟加载 * @param * @return void 返回类型 * @throws */ @Test public void testLoad01() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); Student s = (Student) session.load(Student.class, 1); System.out.println(s.getName()); // 此时student的关联对象classroom也是延迟加载的,会再发出一条sql来取 System.out.println(s.getClassroom().getName()); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if (session != null) session.getTransaction().rollback(); } finally { if (session != null) HibernateUtil.close(session); } } @Test public void testAdd03() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); // 先添加ClassRoom ClassRoom c = new ClassRoom(); c.setName("java高级班"); c.setGrade(10); // 此时数据库中没有ClassRoom没有存储,所以在添加student的时候会抛出异常 但.xml文件中设置了 // cascade="all" 会自动创建关联对象 Student s = new Student(); s.setName("猪八戒"); s.setNo("001"); s.setClassroom(c); session.save(s); Student s2 = new Student(); s2.setName("孙悟空"); s2.setNo("002"); s2.setClassroom(c); session.save(s2); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if (session != null) session.getTransaction().rollback(); } finally { if (session != null) HibernateUtil.close(session); } } /** * * @Title: testDelete01 * @Description: 当多的一方使用cascade时,删除某一个多的,就会报错 * @param * @return void 返回类型 * @throws */ @Test public void testDelete01() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); Student student = (Student) session.load(Student.class, 1); session.delete(student);// 这时候,cascade会制动关联classroom对象进行删除,而classroom在Student中有其他关联的话,就会报错 session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if (session != null) session.getTransaction().rollback(); } finally { if (session != null) HibernateUtil.close(session); } }
相关推荐
- `@OneToMany`, `@ManyToOne`, `@OneToOne`, `@ManyToMany`: 描述实体间的一对多、多对一、一对一和多对多关系。 - `@JoinColumn`: 在关联关系中定义外键列。 - `@Temporal`: 用于日期和时间类型的字段,指定其...
在这个“Hibernate双向一对一关联映射(XML版)”的主题中,我们将深入探讨如何通过XML配置文件实现两个实体之间的一对一关系。 首先,我们需要理解一对一关联的概念。在数据库中,一对一关联意味着两个表中的每一...
具体到这个"SSH整合架包jar",它可能包含了这三个框架的库文件,以及一些整合所需的配置文件,比如struts.xml、hibernate.cfg.xml和spring-context.xml。开发者在项目中引入这个jar包,就可以快速搭建一个支持SSH...
2. **懒加载和立即加载**:默认情况下,`@OneToMany`关系可能是懒加载的,意味着关联的数据不会在加载主实体时立即加载,除非显式调用。如果希望在加载主实体时就获取关联数据,可以设置`fetch = FetchType.EAGER`。...
hiberante3 注解帮助文档hiberante3 注解帮助文档hiberante3 注解帮助文档hiberante3 注解帮助文档hiberante3 注解帮助文档
### Hibernate中的五大核心接口 #### 一、概述 在Hibernate框架中,存在五大核心接口,它们分别是:`Session`、`SessionFactory`、`Transaction`、`Query` 和 `Configuration`。这些接口对于Hibernate的正常运行至...
1. hibernate.cfg.xml:这是Hibernate的主要配置文件,包含了数据库连接信息、缓存设置、实体类映射等。例如,`<session-factory>`标签内的`<property>`元素用于设置属性,如`hibernate.connection.url`指定数据库...
在这个DEMO中,Spring2.5.6采用了Annotation注解的方式,使得代码更加简洁,无需XML配置文件,只需在类或方法上添加注解,就可以声明bean和其依赖。Spring还提供了事务管理、AOP(面向切面编程)等功能,增强了应用...
在Java的持久化框架Hibernate中,一对一(OneToOne)关系是一种常见的对象关系映射(ORM)配置,用于表示两个实体类之间的一种唯一关联。在这个场景中,“hibernate使用主键关联的一对一关系”指的是通过共享主键来...
最新springboot2基础hiberante5完整项目,打包jar,运行jsp,包括后台与前台,拦截器,登录,后台下载就可以使用,注意不是jpa,里面有完整Dao,千万级数据项目分离的代码,为了适合老项目开发特意集成hiberante5....
立即加载(Eager Loading)则是在查询时同时加载关联的对象。批量加载(Bulk Loading)如批处理更新和删除,可以减少数据库交互次数,提高效率。此外,还有集合的分页加载和按需加载等策略。 总结起来,这个压缩包...
五、Hibernate的优势 1. 隐藏了数据库访问细节,提高了开发效率。 2. 提供了面向对象的查询语言HQL,使得查询更直观。 3. 支持级联操作,简化了对象关系的维护。 4. 内置缓存机制,提高性能。 5. 支持多种数据库,...
在Java的持久化框架中,Hibernate是一个非常流行的ORM(对象关系映射)工具,它允许开发者将数据库操作转化为对Java对象的操作。DAO(Data Access Object)层是软件设计模式中的一个重要概念,主要用于处理数据访问...
在 XML 配置文件中,我们可以声明 Spring MVC 的 DispatcherServlet,它是整个 Web 应用的入口点,负责接收请求并分发到相应的处理器。同时,我们还需要配置 ViewResolver,它解析视图,例如 JSP 页面。 接下来,...
**五、会话工厂与会话** Hibernate使用`SessionFactory`来创建`Session`对象,`Session`是与数据库交互的入口。会话负责执行CRUD操作,如保存、更新、删除和查询实体。 **六、查询语言HQL** Hibernate Query ...
Hibernate Tools是一套全新而且完整的面向Hibernate3的工具集合,它包含了Eclipse插件和Ant编译流程。Hibernate Tools是JBoss Tools的核心组件,所以他也是JBoss Developer Studio的一部分
根据提供的文件信息,“hiberante annotations reference.pdf”主要介绍了Hibernate框架中的注解使用方法与参考。下面将基于标题、描述及部分文档内容进行详细的解析。 ### Hibernate注解概述 Hibernate是一个开源...
- **双向关联**: 讨论如何处理双向关联,避免“多对多”循环引用问题。 - **使双向连起来**: 配置双向关联时的注意事项,特别是关于谁是“拥有者”的概念。 **1.3 第三部分——EventManager Web应用程序** - **...
同时,通过@ManyToOne、@OneToMany等关系注解来处理对象间的关联。映射文件(.hbm.xml)是另一种映射方式,虽然在注解方式流行后使用较少,但依然有价值,因为它提供了更细粒度的控制。 三、会话工厂与会话 会话...