Hibernate中多对多的annotation的写法(中间表可以有多个额外添加的字段)
2014-09-01 16:55
447 查看
方案一 中间表联合主键,自动生成一般情况下,多对多的关联关系是需要中间表的;情况一:如果中间表仅仅是做关联用的,它里面仅有2个外键做联合主键,则使用ManyToMany(不用写中间表的Model,只需要写出两张主表的model即可) 学生表 @Entity @Table(name = "T_STUDENT") @SequenceGenerator(name = "SEQ_STUDENT", sequenceName = "SEQ_STUDENT") public class Student implements Serializable { private static final long serialVersionUID = 2524659555729848644L; private Long id; private String name; private Date birthday; private int sex; private String address; private Set<Teacher> teacherList; @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_STUDENT") @Column(name = "ID", nullable = false, precision = 22, scale = 0) public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name = "NAME") public String getName() { return name; } public void setName(String name) { this.name = name; } @Temporal(TemporalType.DATE) @Column(name = "BIRTHDAY") public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } @Column(name = "sex") public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } @Column(name = "address") public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @ManyToMany(cascade = CascadeType.ALL) @JoinTable(name = "T_TEACHER_STUDENT", joinColumns = @JoinColumn(name = "student_id"), inverseJoinColumns = @JoinColumn(name = "teacher_id")) public Set<Teacher> getTeacherList() { return teacherList; } public void setTeacherList(Set<Teacher> teacherList) { this.teacherList = teacherList; } } 教师表 @Entity @Table(name = "T_TEACHER") @SequenceGenerator(name = "SEQ_TEACHER", sequenceName = "SEQ_TEACHER") public class Teacher implements Serializable { private static final long serialVersionUID = 2297316923535111793L; private Long id; private String name; private int sex; private Set<Student> studentList; @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_TEACHER") @Column(name = "ID", nullable = false, precision = 22, scale = 0) public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name = "name") public String getName() { return name; } public void setName(String name) { this.name = name; } @Column(name = "sex") public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } @ManyToMany(mappedBy = "teacherList", cascade = CascadeType.ALL) public Set<Student> getStudentList() { return studentList; } public void setStudentList(Set<Student> studentList) { this.studentList = studentList; } } hibernate.cfg.xml配置2个class类 <mapping class="com.dvn.li.model.Student"/> <mapping class="com.dvn.li.model.Teacher"/> 测试: SessionFactory sessionFactory = null; Session session = null; try { sessionFactory = HibernateUtil.getSessionFactory(); session = sessionFactory.getCurrentSession(); session.beginTransaction(); Student s = new Student(); s.setName("小猪"); Teacher t = new Teacher(); t.setName("小李"); Set<Teacher> t_set = new HashSet<Teacher>(); t_set.add(t); s.setTeacherList(t_set); session.save(s); } catch (Exception e) { if (session != null) { session.getTransaction().rollback(); } } 测试通过!!! 很简单吧!注意HibernateUtil.getSessionFactory()的实现如下: public class HibernateUtil { private static final SessionFactory sessionFactory; static { try { // Create the SessionFactory from hibernate.cfg.xml sessionFactory = new AnnotationConfiguration().configure() .buildSessionFactory(); } catch (Throwable ex) { // Make sure you log the exception, as it might be swallowed System.err.println("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } } 如果自己做测试,可以通过SchemaExport导入表结构 SchemaExport export = new SchemaExport(new AnnotationConfiguration() .configure()); export.create(true, true);
解决方案:多对多的关系拆分为两个一对多!这时候三张表的Model都需要写。 我们知道,一对多的关系,一般都是在多的一方做配置。具体代码如下: 学生表 @Entity @Table(name = "T_STUDENT") @SequenceGenerator(name = "SEQ_STUDENT", sequenceName = "SEQ_STUDENT") public class Student2 implements Serializable { private static final long serialVersionUID = 2524659555729848644L; private Long id; private String name; private Date birthday; private int sex; private String address; private Set<TeacherStudent> teacherStudentList; @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_STUDENT") @Column(name = "ID", nullable = false, precision = 22, scale = 0) public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name = "NAME") public String getName() { return name; } public void setName(String name) { this.name = name; } @Temporal(TemporalType.DATE) @Column(name = "BIRTHDAY") public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } @Column(name = "sex") public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } @Column(name = "address") public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @OneToMany(mappedBy="student",cascade=CascadeType.ALL) public Set<TeacherStudent> getTeacherStudentList() { return teacherStudentList; } public void setTeacherStudentList(Set<TeacherStudent> teacherStudentList) { this.teacherStudentList = teacherStudentList; } } 教师表 @Entity @Table(name = "T_TEACHER") @SequenceGenerator(name = "SEQ_TEACHER", sequenceName = "SEQ_TEACHER") public class Teacher2 implements Serializable { private static final long serialVersionUID = 2297316923535111793L; private Long id; private String name; private int sex; private Set<TeacherStudent> teacherStudentList; @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_TEACHER") @Column(name = "ID", nullable = false, precision = 22, scale = 0) public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name = "name") public String getName() { return name; } public void setName(String name) { this.name = name; } @Column(name = "sex") public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } @OneToMany(mappedBy = "teacher",cascade=CascadeType.ALL) public Set<TeacherStudent> getTeacherStudentList() { return teacherStudentList; } public void setTeacherStudentList(Set<TeacherStudent> teacherStudentList) { this.teacherStudentList = teacherStudentList; } } 中间表 @Entity @Table(name = "T_TEACHERSTUDENT") @SequenceGenerator(name = "SEQ_TEACHERSTUDENT", sequenceName = "SEQ_TEACHERSTUDENT") public class TeacherStudent implements Serializable { private Long id; private Student2 student; private Teacher2 teacher; private String note1; private String note2; @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_TEACHERSTUDENT") @Column(name = "ID", nullable = false, precision = 22, scale = 0) public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name = "note1") public String getNote1() { return note1; } public void setNote1(String note1) { this.note1 = note1; } @Column(name = "note2") public String getNote2() { return note2; } public void setNote2(String note2) { this.note2 = note2; } @ManyToOne(cascade=CascadeType.ALL) @JoinColumn(name = "student_id", unique = true) public Student2 getStudent() { return student; } public void setStudent(Student2 student) { this.student = student; } @ManyToOne @JoinColumn(name = "teacher_id", unique = true) public Teacher2 getTeacher() { return teacher; } public void setTeacher(Teacher2 teacher) { this.teacher = teacher; } } hibernate.cfg.xml 引入对象 <mapping class="com.dvn.li.model.Student2"/> <mapping class="com.dvn.li.model.Teacher2"/> <mapping class="com.dvn.li.model.TeacherStudent"/> 测试: SessionFactory sessionFactory = null; Session session = null; try { sessionFactory = HibernateUtil.getSessionFactory(); session = sessionFactory.getCurrentSession(); session.beginTransaction(); Student2 s = new Student2(); s.setName("小猪"); Teacher2 t = new Teacher2(); t.setName("小李"); TeacherStudent ts=new TeacherStudent(); ts.setStudent(s); ts.setTeacher(t); ts.setNote1("以呀呀!!!"); session.save(s); session.save(t); session.save(ts); session.getTransaction().commit(); } catch (Exception e) { if (session != null) { session.getTransaction().rollback(); } } 测试通过! |
相关文章推荐
- Hibernate中多对多的annotation的写法(中间表可以有多个字段)
- Hibernate中多对多的annotation的写法(中间表可以有多个字段)
- Hibernate中多对多的annotation的写法(中间表可以有多个字段)
- hibernate- Hibernate中多对多的annotation的写法(中间表可以有多个字段)
- Hibernate中多对多的annotation的写法(中间表可以有多个字段)
- Hibernate中多对多的annotation的写法(中间表可以有多个字段)
- Hibernate中多对多的annotation的写法(中间表可以有多个字段)
- hibernate annotation多对多中间表添加其他字段的第三种方法
- hibernate annotation多对多中间表添加其他字段的第三种方法
- mysql 将一张表的汉字字段的首字母借助中间表添加到表中
- Hibernate中以Annotation方式动态更新字段
- MySql 建表、添加字段、修改字段写法
- json.net 序列化组件 Newtonsoft.Json 如果有不需要序列化的字段,可以给该字段添加[JsonIgnore]标记
- bernate中间表配置其他字段(列) annotation不知道怎么配置~
- Hibernate多对多中间关系表有属性(其他字段)的配制方法
- 用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等,需要的朋友可以参考下。
- hibernate如何对Blob类型字段进行数据添加
- hibernate对Blob类型字段进行数据添加
- 给数据库字段添加注释,并且可以通过sql语句查询
- Hibernate Criteria可以只查询出表中几个字段