hibernate單表,一對多,多對多配置文件詳解

一、單表配置方式(使用配置關係映射文件去操作單表的CRUD操作)

1.新建Course.java

public class Course {
	
	private Integer id;  //課程id
	private String name; // 課程名稱
	

	public Course() {
	}

	public Course(Integer id, String name) {
		this.id = id;
		this.name = name;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String toString() {
		return "Course [id=" + id + ", name=" + name + "]";
	}

}
2.新建Course.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.iflytek.model">
	<class name="Course">
	    <!-- 第一種配置id方式 -->
		<id name="id" type="java.lang.Integer">
			<generator class="increment">
				<param name="increment">course_inc</param>
			</generator>
		</id>
		<!-- 第二種配置id方式 -->
		<!-- <id name="id" column="id" type="java.lang.Integer">
			<generator class="native">
			</generator>
		</id> -->
		<property name="name" type="java.lang.String">
			<column name="name" length="64" />
		</property>
	</class>
</hibernate-mapping>

3.測試類TestCourse.java

public class TestCourse {
	private SessionFactory sessionFactory;
	private Session session;
	private Transaction transaction;
	
	@Before
	public void init(){
		//創建配置對象,加載配置文件 hibernate.cfg.xml
		Configuration configuration = new Configuration().configure();
		//創建會話連接工廠
		sessionFactory = configuration.buildSessionFactory();
		//打開會話
		session = sessionFactory.openSession();
		//開啓事務
		transaction = session.beginTransaction();
	}
	

	@After
	public void destory(){
		//提交事務
		transaction.commit();
		//關閉會話
		session.close();
		//關閉工廠會話連接
		sessionFactory.close();
		
	}

	/**
	 * 新增課程信息
	 */
	@Test
	public void testSaveCourse() {
		Course cou = new Course();
		cou.setName("java");
		session.save(cou);
		
		Course cou2 = new Course(2, "python");
		session.save(cou2);
	}

	/**
	 * 更新課程信息
	 */
	@Test
	public void testUpdateStu() {
		// 獲取一個課程對象
		Course cou = (Course) session.get(Course.class, 1);
		cou.setName("c++");
		session.save(cou);
	}

	/**
	 * 刪除課程信息
	 */
	@Test
	public void testDeleteStu() {
		Course cou = (Course) session.get(Course.class, 2);
		session.delete(cou);
	}

	/**
	 * 查詢課程信息
	 */
	@Test
	public void testGetStu() {
		Course cou = (Course) session.get(Course.class, 1);
		System.out.println(cou);

	}



}


二、一對多配置方式(一個學生對應多個選課記錄)

1.新建Course3.java

public class Course3 {
	
	private Integer id;  //課程id
	private String name; // 課程名稱
	
	private Student3 stu;

	public Course3() {
	}

	public Course3(Integer id, String name) {
		this.id = id;
		this.name = name;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Student3 getStu() {
		return stu;
	}

	public void setStu(Student3 stu) {
		this.stu = stu;
	}

	public String toString() {
		return "Course [id=" + id + ", name=" + name + "]";
	}

}
2.新建Course3.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.iflytek.model3">
	<class name="Course3">
		<id name="id" type="java.lang.Integer">
			<generator class="increment">
				<param name="increment">course_inc</param>
			</generator>
		</id>
		<property name="name" type="java.lang.String">
			<column name="name" length="64" />
		</property>
		<!-- 配置多對一的關係 -->
		<many-to-one name="stu" column="sid"></many-to-one>
	</class>
</hibernate-mapping>

3.新建Student3.java

public class Student3 {

	private Integer sid; // 學生id
	private String name; // 學生姓名
	private String gender; // 學生姓名
	private Date birthday; // 學生出生日期
	
	private Set<Course3> cous = new HashSet<Course3>();

	public Student3() {

	}

	

	public Integer getSid() {
		return sid;
	}



	public void setSid(Integer sid) {
		this.sid = sid;
	}



	public String getName() {
		return name;
	}



	public void setName(String name) {
		this.name = name;
	}



	public String getGender() {
		return gender;
	}



	public void setGender(String gender) {
		this.gender = gender;
	}



	public Date getBirthday() {
		return birthday;
	}



	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}



	public Set<Course3> getCous() {
		return cous;
	}



	public void setCous(Set<Course3> cous) {
		this.cous = cous;
	}



	public String toString() {
		return "Student [sid=" + sid + ", name=" + name + ", gender=" + gender
				+ ", birthday=" + birthday + "]";
	}
	
}

4.新建Student3.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.iflytek.model3">
	<class name="Student3">
		<id name="sid" type="integer">
			<generator class="increment">
				<param name="increment">stu_inc</param>
			</generator>
		</id>
		<property name="name" type="string">
			<column name="name" length="64" />
		</property>

		<property name="gender" type="string">
			<column name="gender"></column>
		</property>
		<property name="birthday" type="timestamp">
			<column name="birthday"></column>
		</property>
		
		<!-- 這裏我們配置了one-to-many 一個學生可以對應多個選課記錄 -->
		<set name="cous" cascade="save-update,delete">
			<key column="sid"></key>
			<one-to-many class="Course3" />
		</set>
	</class>
</hibernate-mapping>
5.測試類TestStudent3.java

public class TestStudent3 {
	private SessionFactory sessionFactory;
	private Session session;
	private Transaction transaction;
	
	@Before
	public void init(){
		//創建配置對象,加載配置文件 hibernate.cfg.xml
		Configuration configuration = new Configuration().configure();
		//創建會話連接工廠
		sessionFactory = configuration.buildSessionFactory();
		//打開會話
		session = sessionFactory.openSession();
		//開啓事務
		transaction = session.beginTransaction();
	}
	

	@After
	public void destory(){
		//提交事務
		transaction.commit();
		//關閉會話
		session.close();
		//關閉工廠會話連接
		sessionFactory.close();
		
	}

	/**
	 * 新增學生信息
	 */
	@Test
	public void testSaveStudent() {
		Student3 stu = new Student3();
		stu.setName("張三丰");
		stu.setGender("男");
		stu.setBirthday(new Date());
		
		Course3 cou1 = new Course3();
		cou1.setName("java");
		
		Course3 cou2 = new Course3();
		cou2.setName("c");
		
		stu.getCous().add(cou1);
		stu.getCous().add(cou2);
		
		
		session.save(stu);
	
	}

	/**
	 * 更新學生信息
	 */
	@Test
	public void testUpdateStu() {
		// 獲取一個學生對象
		Student3 stu = (Student3) session.get(Student3.class, 1);
		stu.setName("張峯");
		session.save(stu);
	}

	/**
	 * 刪除學生信息,同時刪除課程表course3對應的數據
	 */
	@Test
	public void testDeleteStu() {
		Student3 stu = (Student3) session.get(Student3.class, 1);
		session.delete(stu);
	}

	/**
	 * 查詢學生信息
	 */
	@Test
	public void testGetStu() {
		Student3 stu = (Student3) session.get(Student3.class, 1);
		System.out.println(stu);
	}
}


三、多對多(學生與課程多對多關係)

1.新建Course4.java

public class Course4 {
	
	private Integer id;  //課程id
	private String name; // 課程名稱
	
	private Set<Student4> students=new HashSet<Student4>();

	public Course4() {
	}

	public Course4(Integer id, String name) {
		this.id = id;
		this.name = name;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Set<Student4> getStudents() {
		return students;
	}

	public void setStudents(Set<Student4> students) {
		this.students = students;
	}

	public String toString() {
		return "Course [id=" + id + ", name=" + name + "]";
	}

}
2.新建Course4.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.iflytek.model4">
	<class name="Course4">
		<!-- 配置哪個屬性 關聯數據表主鍵 -->
		<id name="id" column="id" type="integer">
			<generator class="native"></generator>
		</id>
		<property name="name" type="java.lang.String">
			<column name="name" length="64" />
		</property>
		<!-- 通過table屬性告訴hibernate中間表,cascade指明級聯操作的類型,inverse屬性說明Course4實體類是被控方,不負責維護關係表 ,不能觸發對象和數據庫的同步更新的。-->
		<set name="students" table="student_course" cascade="save-update,delete">
			<key column="id"></key>
			<many-to-many class="Student4" column="sid"></many-to-many>
		</set>
	</class>
</hibernate-mapping>
3.新建Student4.java

public class Student4 {

	private Integer sid; // 學生id
	private String name; // 學生姓名
	private String gender; // 學生性別
	private Date birthday; // 學生出生日期
	
	private Set<Course4> courses = new HashSet<Course4>();

	public Student4() {

	}

	public Integer getSid() {
		return sid;
	}



	public void setSid(Integer sid) {
		this.sid = sid;
	}



	public String getName() {
		return name;
	}



	public void setName(String name) {
		this.name = name;
	}



	public String getGender() {
		return gender;
	}



	public void setGender(String gender) {
		this.gender = gender;
	}



	public Date getBirthday() {
		return birthday;
	}



	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}



	public Set<Course4> getCourses() {
		return courses;
	}



	public void setCourses(Set<Course4> courses) {
		this.courses = courses;
	}



	public String toString() {
		return "Student4 [sid=" + sid + ", name=" + name + ", gender=" + gender
				+ ", birthday=" + birthday + "]";
	}
	
}

4.新建Student4.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.iflytek.model4">
	<class name="Student4">
		<!-- 配置哪個屬性 關聯數據表主鍵 -->
		<id name="sid" column="sid" type="integer">
			<generator class="native"></generator>
		</id>
		<property name="name" type="string">
			<column name="name" length="64" />
		</property>

		<property name="gender" type="string">
			<column name="gender"></column>
		</property>
		<property name="birthday" type="timestamp">
			<column name="birthday"></column>
		</property>

		<!-- 通過table屬性告訴hibernate中間表,cascade指明級聯操作的類型,inverse屬性說明Student4實體類是主控方,負責維護關係表 -->
		<set name="courses" table="student_course" cascade="save-update,delete">
			<key column="sid"></key>
			<many-to-many class="Course4" column="id"></many-to-many>
		</set>

	</class>
</hibernate-mapping>
5.測試類TestManyToMany.java

public class TestManyToMany {
	private SessionFactory sessionFactory;
	private Session session;
	private Transaction transaction;
	
	@Before
	public void init(){
		//創建配置對象,加載配置文件 hibernate.cfg.xml
		Configuration configuration = new Configuration().configure();
		//創建會話連接工廠
		sessionFactory = configuration.buildSessionFactory();
		//打開會話
		session = sessionFactory.openSession();
		//開啓事務
		transaction = session.beginTransaction();
	}
	

	@After
	public void destory(){
		//提交事務
		transaction.commit();
		//關閉會話
		session.close();
		//關閉工廠會話連接
		sessionFactory.close();
		
	}

	/**
	 * 新增學生 和課程信息
	 */
	@Test
	public void saveStudent() {
		Student4 stu = new Student4();
		stu.setName("張三丰");
		stu.setGender("男");
		stu.setBirthday(new Date());
		
		Student4 stu2 = new Student4();
		stu2.setName("張亮");
		stu2.setGender("男");
		stu2.setBirthday(new Date());
		
		Course4 c1=new Course4();  
		c1.setName("English");  
		Course4 c2=new Course4();  
		c2.setName("science");  
		
		stu.getCourses().add(c1);  
		stu.getCourses().add(c2);  
		
		stu2.getCourses().add(c1);  
		stu2.getCourses().add(c2);
		
		
		session.save(stu); 
		session.save(stu2); 
	}

	/**
	 * 更新學生信息
	 */
	@Test
	public void testUpdateStu() {
		// 獲取一個學生對象
		Student4 stu = (Student4) session.get(Student4.class, 1);
		stu.setName("張峯");
		session.save(stu);
	}

	/**
	 * 刪除學生信息
	 */
	@Test
	public void testDeleteStu() {
		Student4 stu = (Student4) session.get(Student4.class, 1);
		session.delete(stu);
	}

	/**
	 * 查詢學生信息
	 */
	@Test
	public void testGetStu() {
		Student4 stu = (Student4) session.get(Student4.class, 1);
		System.out.println(stu);
	}
}







發佈了92 篇原創文章 · 獲贊 29 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章