Hiberante(五) OneToMany_xml 双向关联

实体类

   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);
		}
	}

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hibernate 是一种流行的 ORM(对象关系映射)框架,它可以帮助开发者将 Java 对象映射到关系型数据库中。下面是使用 Hibernate 的基本步骤: 1. 引入 Hibernate 的依赖包(jar 文件)和数据库驱动程序。 2. 配置 Hibernate 的配置文件(hibernate.cfg.xml)和映射文件(*.hbm.xml)。 - 配置文件中包括数据库连接信息、Hibernate 的配置参数以及其他信息。 - 映射文件中定义了 Java 对象和数据库表之间的映射关系。 3. 在 Java 代码中创建 SessionFactory 对象,并使用该对象创建 Session 对象。 - SessionFactory 是线程安全的,应该在应用程序启动时创建。 - Session 是轻量级的,应该在每个事务或操作中创建。 4. 使用 Session 对象来执行 CRUD(增删改查)操作。 - 使用 save() 方法来插入新数据,使用 delete() 方法来删除数据,使用 update() 方法来修改数据,使用 get() 或 load() 方法来查询数据。 5. 在程序结束时关闭 Session 对象和 SessionFactory 对象。 下面是一个使用 Hibernate 进行 CRUD 操作的示例代码: ``` // 创建 Configuration 对象,并读取 hibernate.cfg.xml 配置文件 Configuration configuration = new Configuration().configure(); // 创建 SessionFactory 对象 SessionFactory sessionFactory = configuration.buildSessionFactory(); // 创建 Session 对象 Session session = sessionFactory.openSession(); // 插入新数据 Dog dog = new Dog("Tom", 2); session.save(dog); // 查询数据 Dog dog1 = (Dog) session.get(Dog.class, 1); // 修改数据 dog1.setAge(3); session.update(dog1); // 删除数据 session.delete(dog1); // 关闭 Session 对象和 SessionFactory 对象 session.close(); sessionFactory.close(); ``` 这是一个简单的 Hibernate 示例,你可以根据自己的需要添加更多的数据操作和业务逻辑。同时,你也需要熟悉 Hibernate 的各种配置参数和 API,以更好地使用 Hibernate 进行开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值