第四章 多对一关系

今天我们讲多表操作,
多对一的关系
何为多对一呢?
示例:
学生模型中,一般有班级和学生两个实体,
通常多个学生实体对应一个班级

这种关系在数据库是怎么对应的?
在数据库是通过外键来关联这种关系的.
通常我们会在学生表中加入一个字段,来引用斑级表的主键ID.

建立两张表students, myClass
students
CREATE TABLE `students` (
`id` varchar(32) NOT NULL,
`name` varchar(20) default NULL,
`age` int(11) default NULL,
`birthday` date default NULL,
`class_id` varchar(32) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

myClass
CREATE TABLE `myclass` (
`id` varchar(32) NOT NULL default '',
`name` varchar(20) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Model: Student
public class Student {
private String id;
private Myclass myclass;
private String name;
private Integer age;
private Date birthday;

public Student() {
}

public Student(Myclass myclass, String name, Integer age, Date birthday) {
this.myclass = myclass;
this.name = name;
this.age = age;
this.birthday = birthday;
}

public String getId() {
return this.id;
}

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

public Myclass getMyclass() {
return this.myclass;
}

public void setMyclass(Myclass myclass) {
this.myclass = myclass;
}

public String getName() {
return this.name;
}

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

public Integer getAge() {
return this.age;
}

public void setAge(Integer age) {
this.age = age;
}

public Date getBirthday() {
return this.birthday;
}

public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
Model: Myclass
public class Myclass {

private String id;
private String name;

public Myclass() {
}

public Myclass(String id, String name) {
super();
this.id = id;
this.name = name;
}

public String getId() {
return this.id;
}

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

public String getName() {
return this.name;
}

public void setName(String name) {
this.name = name;
}
}
Myclass.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="chapter2.model.Myclass" table="myclass">
<id name="id" type="java.lang.String" column="id">
<generator class="uuid.hex" />
</id>
<property name="name" type="java.lang.String" column="name" />
</class>
</hibernate-mapping>
Student.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="chapter2.model.Students" table="students">
<id name="id" type="java.lang.String" column="id">
<generator class="uuid.hex" />
</id>
<property name="name" type="java.lang.String" column="name" />
<property name="age" type="java.lang.Integer" column="age" />
<property name="birthday" type="java.util.Date" column="birthday" />
<many-to-one name="myclass" class="chapter2.model.Myclass" column="class_id" />
</class>
</hibernate-mapping>

Dao层:
MyclassDao
public class MyclassDao {
public void create(Myclass myclass){
Session session = null;
try{
session = HibernateUtil.getSession();
session.beginTransaction();
session.save(myclass);
session.getTransaction().commit();
}catch(RuntimeException re){
session.getTransaction().rollback();
throw re;
}
}
}

StudentDao
public class StudentDao {
public void create(Student student){
Session session = null;
try{
session = HibernateUtil.getSession();
session.beginTransaction();
session.save(student);
session.getTransaction().commit();
}catch(RuntimeException re){
session.getTransaction().rollback();
throw re;
}
}
}

测试类:
public class Test {
public static void main(String[] args) {
Myclass myclass = new Myclass("java0802");
Student student = new Student(myclass, "张三", 25, new Date());
StudentDao studentDao = new StudentDao();
MyclassDao myclassDao = new MyclassDao();
myclassDao.create(myclass);
studentDao.create(student);
}
}

给MyclassDao中添加一个查询方法,可以根据ID查询出班级对象
public Myclass findById(Serializable s){
Session session = null;
Myclass myclass = null;
try{
session = HibernateUtil.getSession();
session.beginTransaction();
myclass = (Myclass) session.get(Myclass.class, s);
session.getTransaction().commit();
}catch(RuntimeException re){
session.getTransaction().rollback();
throw re;
}
return myclass;
}

因为通常我们是先知道班级对象, 将一个学生添加到该班级中去,那么我们可以修改Test类的测试方法
public class Test {
public static void main(String[] args) {
StudentDao studentDao = new StudentDao();
MyclassDao myclassDao = new MyclassDao();

Myclass myclass = myclassDao.findById("40285c812792fb9f012792fba0740001");
Student student = new Student(myclass, "李四", 25, new Date());
studentDao.create(student);
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值