示例

设计代码,实现在数据库中建student表、course表、和score表,展现三者关系

student表:id、name

course表:id、name

score表:id、score、student_id、course_id

三张表的关联关系如下:

设计思路

1.首先创建Student实体类和Course实体类

会自动创建中间表,通过@JoinTable注解,设置中间表名为“score”,属性名分别为“student_id”和“course_id”

@ManyToMany
@JoinTable(name="score",
joinColumns={@JoinColumn(name="student_id")},
inverseJoinColumns={@JoinColumn(name="course_id")})

2.创建实体类Score

    private int id;

    private int score;

    private Student student;

    private Course course;

根据步骤1中创建的中间表,通过@Table注解设置表名为“score”,

通过@ManyToOne注解设置属性名分别为“student_id”和“course_id”

3.Junit测试类

@Test
public void test() {
new SchemaExport(new Configuration().configure()).create(true, true);
}

 

具体实现代码如下

1.Student类

@Entity
public class Student {
private int id;
private String name; private Set<Course> courses = new HashSet<Course>(); @Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} @ManyToMany
@JoinTable(name="score", //中间表名
joinColumns={@JoinColumn(name="student_id")}, //属性名
inverseJoinColumns={@JoinColumn(name="course_id")}) //属性名
public Set<Course> getCourses() {
return courses;
}
public void setCourses(Set<Course> courses) {
this.courses = courses;
}
}

2.Course类

@Entity
public class Course {
private int id;
private String name;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

3.Score类

@Entity
@Table(name="score") //对应中间表名
public class Score {
private int id;
private int score;
private Student student;
private Course course;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
} @ManyToOne
@JoinColumn(name="student_id") //对应属性名
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
@ManyToOne()
@JoinColumn(name="course_id") //对应属性名
public Course getCourse() {
return course;
}
public void setCourse(Course course) {
this.course = course;
}
}

4.存储一条数据

@Test
public void testsave() { Session session = sf.getCurrentSession();
session.beginTransaction(); Student s = new Student();
s.setName("lisi"); Course c = new Course();
c.setName("c++"); Score score = new Score();
score.setStudent(s);
score.setCourse(c);
// score.setScore(90); //若不设置,默认为0 session.save(s);
session.save(c);
session.save(score); session.getTransaction().commit();
}

注意

create table score (id integer not null, score integer not null, course_id integer, student_id integer not null auto_increment, primary key (student_id, course_id))

 运行程序,会发现通过程序自动建的score表是有问题的。

 我们想要的是,id为主键,且自增

 而结果是,student_id和course_id为联合主键,且student_id自增

 这是hibernate自身的bug,所以应该手动去数据库中,修改表的结构

Hibernate Student_Course_Score设计的更多相关文章

  1. 深入浅出Struts2+Spring+Hibernate框架

    一.深入浅出Struts2 什么是Struts2? struts2是一种基于MVC的轻量级的WEB应用框架.有了这个框架我们就可以在这个框架的基础上做起,这样就大大的提高了我们的开发效率和质量,为公司 ...

  2. JQuery+Ajax+Struts2+Hibernate 实现完整的登录注册

    写在最前: 下午有招聘会,不想去,总觉得没有准备好,而且都是一些不对口的公司,可是又静不下心来,就来写个博客. 最近在仿造一个书城的网站:http://www.yousuu.com ,UI直接拿来用, ...

  3. Hibernate框架(未完待续······)

        作为SSH三大框架之一的Hibernate,是用来把程序的Dao层和数据库打交道用的,它封装了JDBC的步骤,是我们对数据库的操作更加简单,更加快捷.利用Hibernate框架我们就可以不再编 ...

  4. Hibernate学习笔记整理系列-------一、Hibernate简介

    Hibernate的官网:http://hibernate.org/ 1.1 Hibernate框架的作用 Hibernate框架是一个数据访问框架(也叫持久层框架,可将实体对象变成持久对象).通过H ...

  5. Hibernate常用接口

    Hibernate的接口类型 在了解了Hibernate的基本配置,映射文件后,道路已经铺平了.我们继续往前走.接下来,我们应该做的是了解Hibernate常用的接口,对Hibernate的工作方式进 ...

  6. Hibernate框架(一)——总体介绍

    作为SSH三大框架之一的Hibernate,是用来把程序的Dao层和数据库打交道用的,它封装了JDBC的步骤,是我们对数据库的操作更加简单,更加快捷.利用Hibernate框架我们就可以不再编写重复的 ...

  7. Hibernate第七篇【对象状态、一级缓存】

    前言 本博文主要讲解Hibernate的细节-->对象的状态和一级缓存- 对象状态 Hibernate中对象的状态: - 临时/瞬时状态 - 持久化状态 - 游离状态 学习Hibernate的对 ...

  8. Hibernate【缓存】知识要点

    对象状态 Hibernate中对象的状态: 临时/瞬时状态 持久化状态 游离状态 学习Hibernate的对象状态是为了更清晰地知道Hibernate的设计思想,以及是一级缓存的基础...当然啦,也就 ...

  9. Spring4.x Jpa + hibernate的配置(废弃JpaTemplate)

    近年来 ORM(Object-Relational Mapping,对象关系映射,即实体对象和数据库表的映射)技术市场热闹非凡,各种各样的持久化框架应运而生,其中影响最大的是 Hibernate 和 ...

随机推荐

  1. 封装ShareSDK中的分享功能封以及对类似第三方功能封装的心得【原创】

    本篇的主题有三个: 1.封装思想的介绍 2.我的封装代码 3.我在封装sharesdk(采用的是简洁版本)分享功能是碰到的问题,以及解决方法. PS:其实这个我之前封装过一次,不过最近在重构项目时发现 ...

  2. ansible学习之--安装Svn

    1.安装svn 机器 Ubuntu SMP Thu Jan 15 20:21:55 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux 使用 sudo apt-get in ...

  3. C指针类型小结

    要理解复杂的指针类型其实很简单,一个类型里会出现很多运算符,它们也像普通表达式一样,有优先级. 原则: 从变量名开始,根据运算符优先级结合,一步一步分析. 下面让我们先从简单的类型开始慢慢分析吧: i ...

  4. [浪风推荐]CURL伪造IP和来源

    给“刷票”的朋友提供了很好的换IP的方案,查了下,CURL确实很强悍的可以伪造IP和来源. 1.php 请求 2.php . 1.php代码: $ch = curl_init(); curl_seto ...

  5. centos虚拟机复制后网络重启出错解决

    参考:http://blog.csdn.net/xluren/article/details/38986667 执行service network restart后出现如下错误 FAILED: Bri ...

  6. Java StuNote 1

    1. JAVA语言历史 无心插柳柳成荫,有心栽花花不开. JAVA由SUN Microsystem公司研发. 2. JAVA语言特点 a) 跨平台.一次编译.到处执行. b) 速度慢.但非常稳定, 没 ...

  7. Unity3d 重力感应

    Input.acceleration 加速度 最近一次测量的设备在三维空间中的线性加速度(只读); void Update () { v3=Input.acceleration; } void OnG ...

  8. iOS学习笔记(六)——ViewController

    ViewController是iOS应用程序中重要的部分,是应用程序数据和视图之间的重要桥梁,ViewController管理应用中的众多视图.iOS的SDK中提供很多原生ViewController ...

  9. 使用EasyNVR无插件流媒体服务器接口和EasyPlayer.js播放器插件实现web网页H5播放无插件

    1.背景需求 很多客户在使用EasyNVR无插件流媒体服务器时,不喜欢产品化的界面,有时可能满足不了日常观看使用的需求.因此软件提供丰富的HTTP接口,供第三方平台调用集成.但是有时客户这边可能没有专 ...

  10. oracle 查看表是否被锁

    --以下几个为相关表SELECT * FROM v$lock;SELECT * FROM v$sqlarea;SELECT * FROM v$session;SELECT * FROM v$proce ...