`
舟舟同学
  • 浏览: 44467 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

hibernate开发2--双向1-n关联

阅读更多

开发过程中难免会碰到一对多、多对一的关系,比如一个学生属于一个班级,而一个班级里面有多个学生,一个部门有多个员工等,这种情况就需要用数据库表与表之间的关联关系,如果不用关联关系,维护数据库表格将会变得非常麻烦。下面以多个学生属于一个班级介绍在hibernate中数据库表中1-n的关联关系配置方法。

一、hibernate一对多双向关联映射的方法如下

(1) 一的一端,在set元素中使用key元素来表明需要在对方的表中添加一个外键来指向一的一端

(2) 多的一端,则使用many-to-one元素来映射

二、具体配置实现

(1)建立一的一端的类Classes其代码如下:

package cn.test.Bean;

import java.util.HashSet;
import java.util.Set;

public class Classes {
 private Long id;
 private String name;
 private Set<student> stus = new HashSet<student>();//来保存多个学生对应同一个班级
 public Long getId() {
  return id;
 }

 public void setId(Long id) {
  this.id = id;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public Set<student> getStus() {
  return stus;
 }

 public void setStus(Set<student> stus) {
  this.stus = stus;
 }
}
Classes.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>
<class name="cn.test.Bean.Classes" table="classes">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<set name="stus" table="student" inverse="true" cascade="save-update">
 <key column="classId" not-null="true"></key>
<one-to-many class="cn.test.Bean.student"/>
</set>
</class>
</hibernate-mapping>

说明:在上述配置文件set元素中,inverse属性设置为true,表面主外键关键又student来维护,子元素key中,column属性指定student表中引用classes表的外键为classId,与student.hbm.xml文件中的many-to-one元素的column相对应。

(2)建立多的一端student类

package cn.test.Bean;

public class student {
 private long id;
 private String name;
 private Classes classes;//与一的一端联系起来

 public long getId() {
  return id;
 }
 public void setId(long id) {
  this.id = id;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public Classes getClasses() {
  return classes;
 }

 public void setClasses(Classes classes) {
  this.classes = classes;
 }
}
student.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>
<class name="cn.test.Bean.student" table="student">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<many-to-one name="classes" class="cn.test.Bean.Classes" cascade="save-update" fetch="select" column="classId" not-null="true">
</many-to-one>
</class>
</hibernate-mapping>

说明:many-to-one中,name属性指定在student类中关联的类的属性为classes,cascade属性指定联级操作为save-update,也就是对类student对象保存或者更新会联级保存到Classes类对象。

(3)编写测试代码,让两个学生的信息同属于同一个班级

package cn.test.hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.junit.Test;
import cn.test.Bean.Classes;
import cn.test.Bean.student;
public class TestStudent {
 private SessionFactory sessionFactory;
 @Test
 public void testsave(){
  final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
  .configure() // configures settings from hibernate.cfg.xml
  .build();
     sessionFactory = new MetadataSources( registry ).buildMetadata().buildSessionFactory();
     Session session =sessionFactory.openSession();
     Classes cl=new Classes();
     student st1=new student();
     student st2=new student();
     st1.setName("小明");
     st2.setName("小红");
      cl.setName("一班");
     st1.setClasses(cl);
     st2.setClasses(cl);
     session.beginTransaction();
     session.save(st1);
     session.save(st2);
     session.getTransaction().commit();
     session.close();
 }

}
运行以后,可以看到在数据库student表中,两个学生的classId的值一样,保存的值为classes表中的id的值。

 

0
0
分享到:
评论

相关推荐

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    10.5.7 双向N-N关联 420 10.5.8 使用Map集合记录关联实体 423 10.5.9 对关联实体进行排序 424 10.6 继承关系映射 426 10.6.1 整个类层次对应一张表的 映射策略 427 10.6.2 连接子类的映射策略 430 10.6.3 每个具体...

    低清版 大型门户网站是这样炼成的.pdf

    (Struts 2+Spring 2+Hibernate 3).pdf(完整版) 网上有高清版350M的。可以去下 http://115.com/file/be5gwid8 请于下载后 24H 内及时删除!请抱着学习的态度下载此资料。 总共900多页!!!!!!! 第1篇 ...

    Java面试宝典-经典

    12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...

    Java面试宝典2010版

    12、写Hibernate的一对多和多对一双向关联的orm配置? 9、hibernate的inverse属性的作用? 13、在DAO中如何体现DAO设计模式? 14、spring+Hibernate中委托方案怎么配置? 15、spring+Hibernate中委托方案怎么配置? ...

    最新Java面试宝典pdf版

    12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...

    Java面试笔试资料大全

    12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...

    java面试宝典2012

    12、写Hibernate的一对多和多对一双向关联的orm配置? 134 9、hibernate的inverse属性的作用? 134 13、在DAO中如何体现DAO设计模式? 134 14、spring+Hibernate中委托方案怎么配置? 134 15、spring+Hibernate中委托...

    JAVA面试宝典2010

    12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...

    java面试题大全(2012版)

    12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...

    Java面试宝典2012版

    19、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串? 90 20.现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序...

    Java面试宝典2012新版

    12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...

    Java 面试宝典

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? ...... 7 2、Java 有没有 goto? .......................................................................................................

Global site tag (gtag.js) - Google Analytics