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表第三个属性的显示

 

其他代码部分省略。。。

结果(视频放不了。。。):

 

 大功告成!

 本文系原创,转载请注明出处,谢谢。

原文地址:https://www.cnblogs.com/qintang/p/8511213.html