Hibernate多对多中间表有多个字段字段的注解配置方式(一)

Hibernate多对多中间表有多个字段字段的注解配置方式(一)

  (2011-10-22 13:33:37)
转载
标签: 

hibernate

 

多对多

 

中间字段

 

关系属性

 

注解配置

分类: Java

一般情况下,多对多的关联关系是需要中间表的;

情况一:如果中间表仅仅是做关联用的,它里面仅有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 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 getTeacherList() {
  return teacherList;
 }
 public void setTeacherList(Set 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 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 getStudentList() {
  return studentList;
 }
 public void setStudentList(Set studentList) {
  this.studentList = studentList;
 }
}

hibernate.cfg.xml配置2个class类


测试:

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 t_set = new HashSet();
   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);

你可能感兴趣的:(hibernate)