Hibernate 多对多 中间表含有其他字段 注解方式实现
来源:互联网 发布:淘宝百度云盘会员出租 编辑:程序博客网 时间:2024/05/20 16:12
需求:
两个实体类:Teacher.class Student.class 中间表包含了一个额外字段:score
Teacher.calss
idname1Mr.zhang2Mr.wangStudent.class
idname1Xiaoming2Xiaohong中间表
idteacher_idstudent_idscore1118921290解决办法:
按照传统的多对多注解实现,中间表是以自身id为默认主键,另外包含了两个实体类的id,共3个字段,不能添加额外的字段。
解决办法是将ManyToMany 分解成两个OneToMany。
解决过程:
显示看到了这个blog:http://blog.csdn.net/liuxianbing119/article/details/7283769 知道这么处理,但是可以添加成功,删除一直不成功。
后来翻到了wiki里面的介绍:http://en.wikibooks.org/wiki/Java_Persistence/ManyToMany
知道这种方法肯定没错,就又试了几次,终于成功了。
代码:
1. AbstractEntity.java
package com.cc.persistence;import java.io.Serializable;public abstract class AbstractEntity implements Persistable {public abstract Serializable getInternalId();@Overridepublic boolean equals(Object o) {if (o == null) return false;if (!o.getClass().getName().equals(this.getClass().getName())) return false;return ((Persistable)o).getInternalId().equals(this.getInternalId());}@Overridepublic int hashCode() {return this.getInternalId().hashCode();}}
2.Teacher.java
package com.xx;import java.io.Serializable;import java.util.Date;import java.util.Set;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.FetchType;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.JoinTable;import javax.persistence.ManyToMany;import javax.persistence.OneToMany;import javax.persistence.OrderBy;import javax.persistence.SequenceGenerator;import javax.persistence.Table;import javax.persistence.Transient;@Entity@Table(name = "teacher")public class Teacher extends AbstractEntity{/** * */private static final long serialVersionUID = 2392788383432498751L;private Long id;private String name;private Set<TeacherStudent> teacherStudents;@Id@GeneratedValue(strategy = GenerationType.AUTO)public Long getId() {return id;}public void setId(Long id) {this.id = id;}@Column(name = "name", length = 256)public String getName() {return name;}public void setName(String name) {this.name = name;}@OneToMany(mappedBy = "teacher")public Set<NoticeGroup> getTeacherStudents() {return teacherStudents;}public void setTeacherStudents(Set<TeacherStudent> teacherStudents) {this.teacherStudents = teacherStudents;}@Override@Transientpublic Serializable getInternalId() {return id;}}
3.Student.java
package com.xx;import java.io.Serializable;import java.util.Date;import java.util.HashSet;import java.util.Set;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.FetchType;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.JoinTable;import javax.persistence.ManyToMany;import javax.persistence.OneToMany;import javax.persistence.OrderBy;import javax.persistence.SequenceGenerator;import javax.persistence.Table;import javax.persistence.Transient;@Entity@Table(name = "student")public class Student extends AbstractEntity {/** * */private static final long serialVersionUID = 6380182108640048430L;private Long id;private String name;private Set<TeacherStudent> teacherStudents;@Id@GeneratedValue(strategy = GenerationType.AUTO)public Long getId() {return id;}public void setId(Long id) {this.id = id;}@Column(length = 256)public String getName() {return name;}public void setName(String name) {this.name = name;}@OneToMany(mappedBy = "student")public Set<TeacherStudent> TeacherStudents() {return teacherStudents;}public void setTeacherStudents(Set<TeacherStudent> teacherStudents) {this.teacherStudents = teacherStudents;}@Override@Transientpublic Serializable getInternalId() {return id;}}
4.TeacherStudent.java
package com.xx;import java.io.Serializable;import java.util.Date;import java.util.HashSet;import java.util.Set;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.FetchType;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.ManyToOne;import javax.persistence.Table;import javax.persistence.Transient;@Entity@Table(name = "teacher_student")public class TeacherStudent extends AbstractEntity {/** * */private static final long serialVersionUID = 4876371202187846251L;private Long id;private Teacher teacher;private Student student;private Integer score; @Id@Column(name = "id", nullable = false)@GeneratedValue(strategy = GenerationType.AUTO)public Long getId() {return id;}public void setId(Long id) {this.id = id;}@ManyToOne@JoinColumn(name = "teacher_id")public Teacher getTeacher() {return teacher;}public void setTeacher(Teacher teacher) {this.teacher = teacher;}@ManyToOne@JoinColumn(name = "student_id")public Student getStudent() {return student;}public void setStudent(Student student) {this.student = student;}@Column(name="score")public Integer getScore() {return score;}public void setScore(Integer score) {this.score = score;}@Override@Transientpublic Serializable getInternalId() {// TODO Auto-generated method stubreturn id;}}
5.TeacherDaoImpl.java
添加一个teacher-student 关系:
@Overridepublic boolean addStudentScore(Long teacherId,Long studentId,Integer score) {// TODO Auto-generated method stubStudent student = (Student) studentDao.findById(studentId);Session session = this.getSession();Transaction tx = null;try {tx = session.beginTransaction();Teacher teacher = (Teacher) session.get(getEntityClass(), teacherId);if (teacher != null && student != null) {//new TeacherStudentTeacherStudent ts = new TeacherStudent();ts.setTeacher(teacher);ts.setStudent(student);ts.setScore(score);session.save(ts);session.flush();tx.commit();return true;}} catch (Exception e) {if (tx != null)tx.rollback();} finally {session.close();}return false;}
删除一个teacher-student 关系:
@Overridepublic boolean removeStudentScore(Long teacherId,Long studentId) {// TODO Auto-generated method stubStudent student = (Student) studentDao.findById(studentId);Session session = this.getSession();Transaction tx = null;try {tx = session.beginTransaction();Teacher teacher = (Teacher) session.get(getEntityClass(), teacherId);Set<TeacherStudent> teacherStudents = null;if (teacher != null && student != null) {teacherStudents = teacher.getTeacherStudents();if (teacherStudents.size()>0){for(TeacherStudent teacherStudent:teacherStudents){if(teacherStudent.getStudent().getId().equals(studentId) && teacherStudent.getTeacher().getId().equals(teacherId)){session.delete(teacherStudent);}}}session.flush();tx.commit();return true;}} catch (Exception e) {if (tx != null)tx.rollback();} finally {session.close();}return false;}
1 1
- Hibernate 多对多 中间表含有其他字段 注解方式实现
- Hibernate 多对多中间表 有其他字段映射
- Hibernate多对多中间表有多个字段字段的注解配置方式(一)
- Hibernate多对多中间表有多个字段字段的注解配置方式(二)
- Hibernate多对多中间表有多个字段字段的注解配置方式(二)
- Hibernate多对多中间表有多个字段字段的注解配置方式(三)
- hibernate多对多中间表含有其他属性的配置
- Hibernate多对多中间关系表有属性(其他字段)的配制方法
- hibernate annotation多对多中间表添加其他字段的第三种方法
- hibernate annotation多对多中间表添加其他字段的第三种方法
- hibernate多对多之中间表有多个字段
- hibernate多对多之中间表有多个字段
- Hibernate中多对多的annotation的写法(中间表可以有多个字段)
- Hibernate中多对多的annotation的写法(中间表可以有多个字段)
- Hibernate中多对多的annotation的写法(中间表可以有多个字段)
- Hibernate中多对多的annotation的写法(中间表可以有多个字段)
- Hibernate中多对多的annotation的写法(中间表可以有多个字段)
- Hibernate 多对多之拆分中间表增加有多个关系字段
- 服务器tomcat无法发布web项目
- NYOJ 168 房间安排
- 周二先mark一下
- 6. ZigZag Conversion Leetcode Python
- 【three.js】创建一个场景
- Hibernate 多对多 中间表含有其他字段 注解方式实现
- 关于解决windows7下cmd窗口运行不了helloworld的解决办法
- sort
- 排序sort
- Android RelativeLayout
- Dijkstra算法——C#实现版
- ECS Ubuntu14.04 搭建gitlab 记录
- bRazTGUCCI包包 H9hr oDZ
- DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解