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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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对象中的信息即可!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值