Hibernate JPA 多对对 ManyToMany

xiaoxiao2021-03-01  28

考试表:

@Entity @Table(name="e_exam") public class Exam { @Id @GeneratedValue private int id; private String title; //题目 @Temporal(TemporalType.TIMESTAMP) private Date date = new Date(); //制作时间 private String actor; //操作人 @ManyToMany(cascade={CascadeType.PERSIST,CascadeType.PERSIST,CascadeType.MERGE}) @JoinTable(name="e_exam_subject", joinColumns={ @JoinColumn(name="e_id",referencedColumnName="id") }, inverseJoinColumns={ @JoinColumn(name="s_id",referencedColumnName="id") } ) private Set<Subject> subjects = new HashSet<Subject>(); private int duration; // 考试时间 - 由各个section计算出; 单位分钟 private String remark; private double price; // 试题价格

题目表:

@Entity @Table(name="e_subject") public class Subject { @Id @GeneratedValue(strategy=GenerationType.AUTO) private int id; private int duration; //时长 private String title; //标题 @Lob @Basic(fetch=FetchType.LAZY) private String content; //文字内容-可为空 private String extra; // 附件 [视频音频的URL] private String remark; // 描述 /** * 如果是单向;则去掉该注解 * mappedBy所指向的是关系维护端 * 即实体Exam中的sections字段是关系维护端;维护着与Section的关系 */ @ManyToMany(mappedBy="subjects") private Set<Exam> exams = new HashSet<Exam>();//考试 @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY,mappedBy="subject") private Set<Question> questions = new HashSet<Question>();

生成的中间表的SQL如下:

CREATE TABLE `e_exam_subject` ( `e_id` INT(11) NOT NULL, `s_id` INT(11) NOT NULL, PRIMARY KEY (`e_id`,`s_id`), KEY `FK419B1AA6A567259` (`s_id`), KEY `FK419B1AA6F392544E` (`e_id`), CONSTRAINT `FK419B1AA6A567259` FOREIGN KEY (`s_id`) REFERENCES `e_subject` (`id`) , CONSTRAINT `FK419B1AA6F392544E` FOREIGN KEY (`e_id`) REFERENCES `e_exam` (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8;

当删除【从】表 subject 的记录的时候,将会由于表之间的约束而出错..................

解决办法:

删除中间表,修改表结构如下: drop table e_exam_subject

然后重新创建表

CONSTRAINT `FK419B1AA6A567259` FOREIGN KEY (`s_id`) REFERENCES `e_subject` (`id`) ON DELETE CASCADE, CONSTRAINT `FK419B1AA6F392544E` FOREIGN KEY (`e_id`) REFERENCES `e_exam` (`id`) ON DELETE CASCADE

另外注意一点:主表的关联方式:

CascadeType.PERSIST,CascadeType.PERSIST,CascadeType.MERGE

如果设置为All的时候, 删除主表的时候 从表中的记录会一并删除;故而修改为

CascadeType.PERSIST,CascadeType.PERSIST,CascadeType.MERGE

转载请注明原文地址: https://www.6miu.com/read-3200123.html

最新回复(0)