SSH多表操作入门
这个系统写到这里,所涉及到的都是单表的操作,增删改查,现在功能需要完善,涉及到多表操作,开始是毫无头绪,书上的代码也没有现成的可以借鉴,想来就从最简单的开始。问题出现了很多,不过最后在龙哥的提示下还是实现了,现在把完整过程列出来。
目的很简单:班级表中的一个班级删除或更新后,学生表中对应的学生记录被删除或学生对应的班级信息得到更新。
1.数据表
第一个是班级表(本来想叫class,在程序中与关键字冲突,改为c后,也一直报错,最后改为ce)
ce
第二个是学生表
se
这里ce表中cname为主键,se表中sid为主键,cname为外键。
然后在se表中进行外键关联(这里要注意的是,表建立以后要把表的类型类型改为InnoDB,否则它会提示不支持外键操作):
下面的框框默认为无动作,这里要改成层叠,即级联操作(应该是),如不修改,则当你修改cname表中的数据时会提示无法修改,出错。
上面的步骤完成后,当你修改或删除ce表中的cname时,se表中的cname也会更新或者对应的记录被删除。这个时候说明数据库已经成功建立。
2.SSH框架代码
把PO、DAO、Service、Action、applicationContext.xml、struts.xml、jsp的代码都写好,这里主要是PO层,其他都跟之前一致,只是在CeDAO中加一个“根据名称删除班级”的方法。
Ce.java
1 package po; 2 3 import javax.persistence.Column; 4 import javax.persistence.Entity; 5 import javax.persistence.GeneratedValue; 6 import javax.persistence.GenerationType; 7 import javax.persistence.Id; 8 import javax.persistence.Table; 9 10 @Entity 11 @Table(name = "ce") 12 public class Ce { 13 @Id @Column(name="cname") 14 @GeneratedValue(strategy = GenerationType.AUTO) 15 private String cname; 16 17 public String getCname() { 18 return cname; 19 } 20 public void setCname(String cname) { 21 this.cname = cname; 22 } 23 }
Se.java
1 package po; 2 3 import javax.persistence.Column; 4 import javax.persistence.Entity; 5 import javax.persistence.GeneratedValue; 6 import javax.persistence.GenerationType; 7 import javax.persistence.Id; 8 import javax.persistence.JoinColumn; 9 import javax.persistence.ManyToOne; 10 import javax.persistence.Table; 11 12 import org.hibernate.annotations.Cascade; 13 import org.hibernate.annotations.CascadeType; 14 15 @Entity 16 @Table(name = "se") 17 public class Se { 18 @Id @Column(name="sid") 19 @GeneratedValue(strategy = GenerationType.AUTO) 20 private String sid; 21 22 @Column(name="sname") 23 private String sname; 24 25 @ManyToOne(targetEntity=Ce.class) 26 @JoinColumn(name="cname") 27 @Cascade(CascadeType.ALL) 28 private Ce ce; 29 30 public String getSid() { 31 return sid; 32 } 33 34 public void setSid(String sid) { 35 this.sid = sid; 36 } 37 38 public String getSname() { 39 return sname; 40 } 41 42 public void setSname(String sname) { 43 this.sname = sname; 44 } 45 46 public Ce getCe() { 47 return ce; 48 } 49 50 public void setCe(Ce ce) { 51 this.ce = ce; 52 } 53 }
这里要注意两点:
1. 3个注解缺一不可,特别是级联操作的第三个
2. jsp中对于se表第三个属性的显示
其他代码部分省略。。。
结果(视频放不了。。。):
大功告成!
本文系原创,转载请注明出处,谢谢。