关系/对象映射 多对多关系(@ManyToMany 注释)【重新认识】
2024-10-07 02:52:18
old:
@ManyToMany 注释:表示此类是多对多关系的一边,
mappedBy 属性定义了此类为双向关系的维护端,
注意:mappedBy 属性的值为此关系的另一端的属性名。
例如,在Student类中有如下方法:
被控方:
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "students")
public Set<Teacher> getTeachers() {
return teachers;
}
那么这里的“students”就是Teachers的一个属性,通常应该是这样的:
Set<Student> students;
另一端的getStudents方法如下所示:
主控方:
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(
name = "Teacher_Student",
joinColumns = {@JoinColumn(name = "Teacher_ID", referencedColumnName = "teacherid")},
inverseJoinColumns = {@JoinColumn(name = "Student_ID", referencedColumnName ="studentid")}
)
public Set<Student> getStudents() {
return students;
}
@ManyToMany 注释表示Teacher 是多对多关系的一端。
@JoinTable 描述了多对多关系的数据表关系。
name 属性指定中间表名称,
joinColumns 定义中间表与Teacher 表的外键关系。
上面的代码中,
中间表Teacher_Student的Teacher_ID 列是Teacher 表的主键列对应的外键列,
inverseJoinColumns 属性定义了中间表与另外一端(Student)的外键关系。
可以通过上面的定义看到有三个表学生表--老师表--老师学生中间表
以上提到主控方和被控方。。本人不赞同这种写法:
理由是: 1.既然是多对多关系。。为什么还要分主动方和被动方?
2.为什么需要删除老师后才级联中间表。。。请注意:以上定义方法时,删除学生是无法级联删除中间表的。
正确的写法应该是两边都用主控方的写法:
只是joinColumns和inverseJoinColumns属性的地方互换就可以了
new:
总结:
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(
name = "Teacher_Student",
joinColumns = {@JoinColumn(name = "Student_ID", referencedColumnName = "studentid")},
inverseJoinColumns = {@JoinColumn(name = "Teacher_ID", referencedColumnName ="teacherid")}
)
public Set<Teacher> getTeachers() {
return teachers;
}
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(
name = "Teacher_Student",
joinColumns = {@JoinColumn(name = "Teacher_ID", referencedColumnName = "teacherid")},
inverseJoinColumns = {@JoinColumn(name = "Student_ID", referencedColumnName ="studentid")}
)
public Set<Student> getStudents() {
return students;
}
2017-08-15 10:24:43
最新文章
- REDHAT一总复习1 禁用颜色
- LINUX的磁盘管理du命令详解
- Java Web网站应用中的单点登录
- android之打开网页
- Codevs 1078 ==Poj 1258 Agri-Net
- javasctipt显示几分钟前、几天前等
- 【转】提高PHP性能的53个技巧
- android启动优化
- Javascript经典实例 - 字符串
- 如何关闭tomcat的localhost_access_log?
- C# 的sql server like 的参数
- vue中一个dom元素可以绑定多个事件?
- Taro音频createVideoContext组件无法调用方法
- 【3dsmax2016】安装图文教程、破解注册以及切换语言方法
- win32 进程崩溃时禁止弹出错误对话框
- Linux之HugePages快速配置
- Chrome浏览器被hao123劫持,浏览器主页会被篡改为 hao123等
- Android 上传文件,图片。以及服务器端接收相关。
- python字符串格式化之format
- check_http检查http服务
热门文章
- mysql innodb存储引擎 锁 事务
- POJ - 2689 Prime Distance (区间筛)
- 【CF1181D】Irrigation
- VCL界面开发必备装备!DevExpress VCL v19.1.5你值得拥有
- django初步--+urls解析
- Android Studio 创建项目后“Cannot resolve symbol” 解决办法
- C#写入文件内容时提示:文件正被另一个人或程序使用
- IE大文件断点续传
- CF 352 D 罗宾汉发钱 模拟题+贪心
- Codeforces 1213F Unstable String Sort