示例

设计代码,实现在数据库中建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,所以应该手动去数据库中,修改表的结构

最新文章

  1. Syscan360会议胸牌破解揭秘
  2. angular1.x的简单介绍 (一)
  3. MySQL GROUP BY用法
  4. JavaScript——理解闭包及作用
  5. 注解:【有连接表的】Hibernate双向1-&gt;N关联(仅N端控制关联关系)
  6. PUTTY用密钥登陆服务器
  7. MES系统学习
  8. IIS 伪静态配置(安装ISAPI_Rewrite配置)
  9. 简易安装python统计包
  10. HDU 4048 Zhuge Liang&#39;s Stone Sentinel Maze
  11. Java-Android 之输入提示框
  12. Java jvm 原理
  13. cmd 更改计算机名
  14. AndroidStudio下gradle的入门介绍与使用
  15. ELK原理与简介
  16. Python-第一章(开发基础)
  17. Ionic2 App Import BrowserAnimationsModule or NoopAnimationsModule问题
  18. UVALive - 6440(模拟)
  19. webservice复杂类型实例
  20. 让node支持es模块化(export、import)的方法

热门文章

  1. Java获取系统默认浏览器打开链接
  2. CDH配置JAVA_HOME
  3. php5.4n 长链接 bug
  4. [浪风推荐]CURL伪造IP和来源
  5. (转)Unity 导出XML配置文件,动态加载场景
  6. hdu 4587(割点的应用)
  7. java编程:将数组的第一个为最大第二个为最小以此类推
  8. Consul1 在window7安装
  9. PHP中导出Excel,将数据以Excel形式导出
  10. CodeIgniter框架——表单辅助函数总结