目录
1.Model实体层
1.1 管理员实体类(Manager)
建立实体包com.java.model;
建立管理员实体类Manager:
package com.java.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.hibernate.annotations.GenericGenerator;
/*采用注解映射表t_manager,不用xml映射形式*/
@Entity//映射实体
@Table(name="t_manager")
public class Manager {
//编号
private int id;
//用户名
private String userName;
//密码
private String passWord;
//管理员姓名
private String name;
//标识,flag为1就是代表管理员,且不映射到数据库中
private String flag="1";
//设置主键
@Id
@GeneratedValue(generator="_native")
//生策略是native,设置表字段自增,非空
@GenericGenerator(name="_native",strategy="native")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//设置flag不映射到数据库中用Transient
@Transient
public String getFlag() {
return flag;
}
public void setFlag(String flag) {
this.flag = flag;
}
}
这里同时要在配置文件hibernate.cfg.xml中添加一下映射路径:
1.2 转换字符集类MySQL5DialectUTF8
我们要在com.java.util工具类里面新增一个方法:
package com.java.util;
import org.hibernate.dialect.MySQL5InnoDBDialect;
public class MySQL5DialectUTF8 extends MySQL5InnoDBDialect{
//这里重写getTableTypeString方法,使其hibernate自动建库的时候默认字符为utf8
@Override
public String getTableTypeString() {
// TODO Auto-generated method stub
return " ENGINE=InnoDB DEFAULT CHARSET=utf8";
}
}
我们这里还要将原先的hibernate.cfg.xml配置文件里面的方言修改一下:
改成我们自己写的子类;
这时我们可以运行一下HibernateUtil工具类,看看是否在数据库中成功建表t_manager;
这时已经显示运行成功,我们再去看看数据库;
可以看到已经成功建表而且默认字符集也是utf8;
1.3 试卷实体类(Paper)
package com.java.model;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name="t_paper")
public class Paper {
//编号
private int id;
//试卷名称
private String paperName;
//日期
private Date JoinDate;
//试题question字段
private Set<Question> questions=new HashSet<Question>();
@Id
@GeneratedValue(generator="_native")
//生成策略是native,设置表字段自增,非空
@GenericGenerator(name="_native",strategy="native")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPaperName() {
return paperName;
}
public void setPaperName(String paperName) {
this.paperName = paperName;
}
public Date getJoinDate() {
return JoinDate;
}
public void setJoinDate(Date joinDate) {
JoinDate = joinDate;
}
//一张试卷对应多个试题,用EAGER的方式获得paper的时候立即加载所有的question
@OneToMany(mappedBy="paper",fetch=FetchType.EAGER)
public Set<Question> getQuestions() {
return questions;
}
public void setQuestions(Set<Question> questions) {
this.questions = questions;
}
}
这里同时要在配置文件hibernate.cfg.xml中添加一下映射路径:
1.4 试题实体类(Question)
package com.java.model;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name="t_question")
public class Question {
private int id;
//试题内容
private String subject;
//试题类型
private String type;
//时间
private Date joinTime;
//题目的4个选项
private String optionA;
private String optionB;
private String optionC;
private String optionD;
//题目的正确答案
private String answer;
//用户选择的答案
private String userAnswer;
//试卷paper字段
private Paper paper;
@Id
@GeneratedValue(generator="_native")
//生成策略是native,设置表字段自增,非空
@GenericGenerator(name="_native",strategy="native")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Date getJoinTime() {
return joinTime;
}
public void setJoinTime(Date joinTime) {
this.joinTime = joinTime;
}
public String getOptionA() {
return optionA;
}
public void setOptionA(String optionA) {
this.optionA = optionA;
}
public String getOptionB() {
return optionB;
}
public void setOptionB(String optionB) {
this.optionB = optionB;
}
public String getOptionC() {
return optionC;
}
public void setOptionC(String optionC) {
this.optionC = optionC;
}
public String getOptionD() {
return optionD;
}
public void setOptionD(String optionD) {
this.optionD = optionD;
}
//设置flag不映射到数据库中用Transient
@Transient
public String getUserAnswer() {
return userAnswer;
}
public void setUserAnswer(String userAnswer) {
this.userAnswer = userAnswer;
}
//多个题目对应一张试卷
@ManyToOne
@Cascade(value={CascadeType.SAVE_UPDATE})
@JoinColumn(name="paperId")
public Paper getPaper() {
return paper;
}
public void setPaper(Paper paper) {
this.paper = paper;
}
public String getAnswer() {
return answer;
}
public void setAnswer(String answer) {
this.answer = answer;
}
}
这里同时要在配置文件hibernate.cfg.xml中添加一下映射路径:
1.5 学生实体类(Student)
package com.java.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;
@Entity
@Table(name="t_student")
public class Student {
//学号
private String id;
//姓名
private String name;
//密码
private String password;
//性别
private String sex;
//专业
private String profession;
//身份证号码
private String cardNum;
//标识,flag为2标识学生,且不映射到数据库中
private String flag="2";
@Id
/*
* 数据库表中主键列名为id,如果实体类属性名和列名相同,此注解可以省略
* 主键id唯一,非空且长度为40,前面默认的都是255
*/
@Column(name="id",unique=true,nullable=false,length=40)
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Column(name="name",length=20)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Column(name="password",length=20)
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Column(name="sex",length=5)
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Column(name="profession",length=40)
public String getProfession() {
return profession;
}
public void setProfession(String profession) {
this.profession = profession;
}
@Column(name="cardNum",length=50)
public String getCardNum() {
return cardNum;
}
public void setCardNum(String cardNum) {
this.cardNum = cardNum;
}
@Transient
public String getFlag() {
return flag;
}
public void setFlag(String flag) {
this.flag = flag;
}
}
这里同时要在配置文件hibernate.cfg.xml中添加一下映射路径:
1.6 考试实体类(Exam)
package com.java.model;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name="t_exam")
public class Exam {
//考试编号
private int id;
//学生信息
private Student student;
//试卷信息
private Paper paper;
//单选题得分
private int singleScore;
//多选题得分
private int moreScore;
//总分
private int score;
//考试日期
private Date examDate;
@Id
@GeneratedValue(generator="_native")
//生策略是native,设置表字段自增,非空
@GenericGenerator(name="_native",strategy="native")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
//多对一策略
@ManyToOne
//外键studentId
@JoinColumn(name="studentId")
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
//多对一策略
@ManyToOne
//外键paperId
@JoinColumn(name="paperId")
public Paper getPaper() {
return paper;
}
public void setPaper(Paper paper) {
this.paper = paper;
}
public int getSingleScore() {
return singleScore;
}
public void setSingleScore(int singleScore) {
this.singleScore = singleScore;
}
public int getMoreScore() {
return moreScore;
}
public void setMoreScore(int moreScore) {
this.moreScore = moreScore;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public Date getExamDate() {
return examDate;
}
public void setExamDate(Date examDate) {
this.examDate = examDate;
}
}
这里同时要在配置文件hibernate.cfg.xml中添加一下映射路径:
2. 添加数据以及查看各表之间的关系
在数据库中,我们建立的几张表应该有如下的主外键关联;
另外,我们向各表之中插入一些数据;