最近重新静下心来好好复习过去的知识,写写文章让自己映象更加深刻
Hibernate oneToMany实现方式:1、只有2个实体表,关系由多方维护;2、有2个实体表,一个关系表,关系在关系表中提现。如下重点介绍1.只有2个实体表方式;
步骤:
1.SQL 建表 tb_teacher表及tb_student表
CREATE TABLE `tb_teacher` (
`t_id` INT(11) NOT NULL AUTO_INCREMENT,
`t_name` VARCHAR(20) DEFAULT NULL,
PRIMARY KEY (`t_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
CREATE TABLE `tb_student` (
`s_id` INT(11) NOT NULL AUTO_INCREMENT,
`s_name` VARCHAR(20) DEFAULT NULL,
`t_id` INT(11) DEFAULT NULL,
PRIMARY KEY (`s_id`),
KEY `fk_student_teacher` (`t_id`),
CONSTRAINT `fk_student_teacher` FOREIGN KEY (`t_id`) REFERENCES `tb_teacher` (`t_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
2.创建JavaBean对应的实体对象
Teacher.java
package com.hibernate.entity;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name="tb_teacher")
public class Teacher implements Serializable {
private Integer teacherId;
private String teacherName;
private Set<Student> students = new HashSet<Student>();
public Teacher(){}
public Teacher(Integer teacherId,String teacherName){
this.teacherId = teacherId;
this.teacherName = teacherName;
}
public Teacher(Integer teacherId,String teacherName,String teacherTel,Set<Student> students){
this.teacherId = teacherId;
this.teacherName = teacherName;
this.students = students;
}
@GenericGenerator(name = "generator", strategy = "increment")
@Id
@GeneratedValue(generator = "generator")
@Column(name="t_id",length=11,nullable=false)
public Integer getTeacherId() {
return teacherId;
}
public void setTeacherId(Integer teacherId) {
this.teacherId = teacherId;
}
@Column(name="t_name",length=20)
public String getTeacherName() {
return teacherName;
}
public void setTeacherName(String teacherName) {
this.teacherName = teacherName;
}
@OneToMany(mappedBy="teacher",cascade={CascadeType.ALL},targetEntity=Student.class,fetch=FetchType.LAZY)
@OrderBy("studentId")
//一对多的关系 注意mappedBy为该类名称 只有2个实体表的情况,有关系表则为关系表名称
//orderby为student javaBean的 属性
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}
Student.java
package com.hibernate.entity;
import java.io.Serializable;
import javax.persistence.Column;
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="tb_student")
//标注对应的表
public class Student implements Serializable {
private Integer studentId;
private String studentName;
private Teacher teacher;
public Student(){}
public Student(Integer studentId,String studentName){
this.studentId = studentId;
this.studentName = studentName;
}
public Student(Integer studentId,String studentName,Teacher teacher){
this.studentId = studentId;
this.studentName = studentName;
this.teacher = teacher;
}
@GenericGenerator(name="generator",strategy="increment")
@Id
@GeneratedValue(generator="generator")
@Column(name="s_id",length=11,nullable=false)
public Integer getStudentId() {
return studentId;
}
public void setStudentId(Integer studentId) {
this.studentId = studentId;
}
@Column(name="s_name",length=20)
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
@ManyToOne
//多对一的关系
@JoinColumn(name="t_id")
//字段指向表中外键字段
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
}
3.Hibernate.cfg.xml配置
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:mysql://localhost:3306/test</property>
<property name="connection.username">root</property>
<property name="connection.password">rootpassword</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="current_session_context_class">thread</property>
<!--使用标注方式时加上上面属性 否则容易报异常,原因还得在去琢磨消化源码-->
<property name="show_sql">true</property>
<!--使用标注 直接mapping对应的JavaBean-->
<mapping class="com.hibernate.entity.Teacher" />
<mapping class="com.hibernate.entity.Student" />
</session-factory>
</hibernate-configuration>
4.测试
package com.hibernate.test;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import com.hibernate.entity.Student;
import com.hibernate.entity.Teacher;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Teacher teacher = new Teacher();
teacher.setTeacherName("akvo");
teacher.setTeacherTel("13222654322");
Student student1 = new Student();
student1.setStudentName("aaa");
student1.setStudentTel("13123123123");
student1.setTeacher(teacher);
Student student2 = new Student();
student2.setStudentName("李华");
student2.setStudentTel("13197211723");
student2.setTeacher(teacher);
Student student3 = new Student();
student3.setStudentName("李四");
student3.setStudentTel("13128511723");
student3.setTeacher(teacher);
Set<Student> students = new HashSet<Student>();
students.add(student1);
students.add(student2);
students.add(student3);
student1.setStudentBalance(1000f);
student2.setStudentBalance(100f);
student3.setStudentBalance(800f);
SessionFactory sessionFactory = new AnnotationConfiguration().configure("hibernate.cfg.xml").buildSessionFactory();
Session session = null;
Transaction ts = null;
try {
session = sessionFactory.getCurrentSession();
ts = session.beginTransaction();
session.save(teacher);
ts.commit();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
ts.rollback();
}
}
}