Hibernate多对多@ManyToMany及多对一@ManyToOne学习

来源:互联网 发布:windows中的文件属性 编辑:程序博客网 时间:2024/05/29 15:06

1.   多对多映射(@ManyToMany)

比如:班级和课程,一个班级可以对应多个课程,一个课程可以对应多个课程,故班级和课程之间的关系应当是多对多.那么,在写Hibernate的注解时就可以这么写…(加粗加斜加红部分)

Course类:

@Entity

@Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)

@Table(name="t_course")

 

public class Courseextends BaseEntity{

@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

@Column(name="course_id")

private int courseId;

@Column(name="course_no")

privateString courseNo;

@Column(name="course_name")

privateString courseName;

@Column(name="course_type")

private int courseType;

@Column(name="nature")

privateString nature;

@Column(name="credit")

private double credit;

@Column(name="period")

private int period;

@Column(name="college")

privateString college;

@Column(name="department")

privateString department;

@Column(name="creator")

private int creator;

@Column(name="materia_path")

privateString materiaPath;

@Column(name="valid")

private int valid;

@Column(name="create_date")

private DatecreateDate;


@ManyToMany(cascade= CascadeType.PERSIST, fetch =FetchType.LAZY)

@JoinTable(name ="t_class_course",

joinColumns ={@JoinColumn(name = "course_id", referencedColumnName ="course_id")},

inverseJoinColumns= {@JoinColumn(name = "class_id", referencedColumnName ="class_id")})

private List<Class> classes;

 

      

Class类:

@Entity

@Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)

@Table(name="t_class")

 

public class Class extends BaseEntity{

/**

*

*/

private static final long serialVersionUID =1L;

@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

@Column(name="class_id")

private int classId;

@Column(name="class_name")

privateString className;

@Column(name="type")

private int type;

@Column(name="path")

private int path;

@Column(name="class_year")

private int classYear;

 

@ManyToMany(cascade= CascadeType.PERSIST, fetch =FetchType.LAZY)

@JoinTable(name ="t_class_course",

joinColumns ={@JoinColumn(name = "class_id", referencedColumnName ="class_id")},

inverseJoinColumns= {@JoinColumn(name = "course_id", referencedColumnName="course_id")})

private List<Course> courses;

 

@Column(name="valid")

private int valid;

@Column(name="create_date")

private DatecreateDate;

 

表示的意思是:

@ManyToMany 多对多关系,cascade级联属性,fetch抓取策略

@JoinTable 生成的表,name生成表的名字,joinColumns关联属性的集合,joinColumn关联属性

 

这样会生成一张表t_class_course

表中有两个字段,分别引用自t_class和t_course

当我要访问t_class中的course时,只需要在java代码中直接getCourse()就可以得到course的集合了.

但当我需要使用其他字段例如createDate字段时,那么自动生成的表就无法满足我们的要求.为了能让我们自己控制表的结构.可以将多对多关系拆分成两个多对一关系,现在有如下3张表

t_class,t_course,t_class_course各对应各自的类(t_class_course不再是由hibernate自动生成)

在t_class_course中这样写.

@Entity

@Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)

@Table(name="t_user_class")

 

public classUser_Class extends BaseEntity{

 

private static final long serialVersionUID =1L;

@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

@Column(name="user_class_id")

private int userClassId;

 

@ManyToOne(targetEntity=Course.class,fetch=FetchType.LAZY)

@JoinColumn(name="course_id",updatable=false)

private Coursecourse;

 

@ManyToOne(targetEntity=Class.class,fetch=FetchType.LAZY)

@JoinColumn(name="class_id",updatable=false)

private Classclas;

 

@Column(name="type")

private int type;

 

@Column(name="valid")

private int valid;

 

@Column(name="create_date")

private DatecreateDate;

在这种情况下,如果我们想访问某个班级所对应的课程,那么我们应当从t_class_course表下手,查询特定class_id的记录,返回的是一个Class_Course的集合,那么遍历这个集合,集合中的Course对象就是我们所要查询的对象,然后根据我们的需要输出Course对象中的信息即可!


0 0
原创粉丝点击