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对象中的信息即可!
本文介绍了Hibernate中多对多@ManyToMany和多对一@ManyToOne的映射方式,以班级与课程为例,展示了如何通过注解配置关系。通过@JoinTable定义中间表t_class_course,并探讨了当需要更多字段时如何将多对多关系转换为两个多对一关系,以更好地控制表结构。最后,展示了在多对一关系下如何查询和获取所需信息。
191

被折叠的 条评论
为什么被折叠?



