您的位置:首页 > 其它

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();

}

}


测试通过!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐