java 代码
- package com.test;
- import java.util.HashSet;
- import java.util.Set;
- import com.test.domain.Student;
- import com.test.domain.Teacher;
- public class Test {
- public static void main(String[] args){
- Student student1 = new Student();
- Student student2 = new Student();
- Teacher teacher1 = new Teacher();
- Teacher teacher2 = new Teacher();
- student1.setStudentname("student1");
- student2.setStudentname("student2");
- teacher1.setTeachername("teachername1");
- teacher2.setTeachername("teachername2");
- Set set1 = new HashSet();
- set1.add(teacher1);
- set1.add(teacher2);
- student1.setTeachers(set1);
- student2.setTeachers(set1);
- OperatorDb od = new OperatorDb();
- od.saveUser(student1);
- od.saveUser(student2);
- }
- }
- 输出结果为:
- Hibernate: insert into hibernate.student (studentname) values (?)
- Hibernate: insert into hibernate.teacher (teachername) values (?)
- Hibernate: insert into hibernate.teacher (teachername) values (?)
- Hibernate: insert into teacher_student (student_id, teacher_id) values (?, ?)
- Hibernate: insert into teacher_student (student_id, teacher_id) values (?, ?)
- Hibernate: insert into hibernate.student (studentname) values (?)
- Hibernate: insert into teacher_student (student_id, teacher_id) values (?, ?)
- Hibernate: insert into teacher_student (student_id, teacher_id) values (?, ?)
建表语句
sql 代码
- --
- -- Host: localhost Database: hibernate
- -- ------------------------------------------------------
- -- Server version 5.0.24a-community-nt
- /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
- /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
- /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
- /*!40101 SET NAMES utf8 */;
- /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
- /*!40103 SET TIME_ZONE='+00:00' */;
- /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
- /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
- /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
- /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
- --
- -- Current Database: `hibernate`
- --
- CREATE DATABASE /*!32312 IF NOT EXISTS*/ `hibernate` /*!40100 DEFAULT CHARACTER SET utf8 */;
- USE `hibernate`;
- --
- -- Table structure for table `detail`
- --
- DROP TABLE IF EXISTS `user`;
- CREATE TABLE `user` (
- `id` int(11) NOT NULL auto_increment,
- `username` varchar(255) NOT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
- DROP TABLE IF EXISTS `card`;
- CREATE TABLE `card` (
- `userId` int(11) NOT NULL default '0',
- `cardNum` varchar(255) NOT NULL,
- PRIMARY KEY (`userId`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
- DROP TABLE IF EXISTS `item`;
- CREATE TABLE `item` (
- `id` int(11) NOT NULL auto_increment,
- `userId` int(11) NOT NULL default '0',
- PRIMARY KEY (`id`),
- foreign key(userId) references outTable(id) on delete cascade on update cascade
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
1. one-to-one(用户和卡片)
user.hbm.xml
xml 代码
- xml version="1.0" encoding="utf-8"?>
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="yahaitt.bobo.domain.User" table="user">
- <id name="id" type="java.lang.Integer">
- <column name="id" />
- <generator class="native" />
- id>
- <property name="username" type="java.lang.String">
- <column name="username" not-null="true" />
- property>
- <one-to-one name="card" class="yahaitt.bobo.domain.Card" cascade="all">one-to-one>
- class>
- hibernate-mapping>
Card.hbm.xml:
xml 代码
- xml version="1.0" encoding="utf-8"?>
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="yahaitt.bobo.domain.Card" table="card">
- <id name="userId" type="java.lang.Integer">
- <column name="userId" />
- <generator class="foreign" >
- <param name="property">userparam>
- generator>
- id>
- <property name="cardNum" type="java.lang.String">
- <column name="cardNum" not-null="true" />
- property>
- <one-to-one name="user" class="yahaitt.bobo.domain.User" >
- one-to-one>
- class>
- hibernate-mapping>
2. many-to-one (用户与Item)
注:两边都定义外键,而且不能像one-to-one里那样定义外键
如:这样定义是错误的:
xml 代码
- <generator class="foreign" >
- <param name="property">userparam>
- generator>
user.hbm.xml:
xml 代码
- xml version="1.0" encoding="utf-8"?>
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="ttitfly.domain.User" table="user" >
- <id name="id" type="java.lang.Integer">
- <column name="id" />
- <generator class="native" />
- id>
- <property name="username" type="java.lang.String">
- <column name="username" not-null="true" />
- property>
- <set name="items" inverse="true" cascade="all" >
- <key>
- <column name="userId" not-null="true" >
- column>
- key>
- <one-to-many class="ttitfly.domain.Item"/>
- set>
- class>
- hibernate-mapping>
item.hbm.xml
xml 代码
- xml version="1.0" encoding="utf-8"?>
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="ttitfly.domain.Item" table="item" >
- <id name="id" type="java.lang.Integer">
- <column name="id" />
- <generator class="native" />
- id>
- <many-to-one name="user" class="ttitfly.domain.User">
- <column name="userId" not-null="true">column>
- many-to-one>
- class>
- hibernate-mapping>
测试类:Test.java
java 代码
- public class Test {
- public static void main(String[] args){
- User user = new User();
- user.setUsername("testonetomany");
- Item item1 = new Item();
- Item item2 = new Item();
- Set set = new HashSet();
- set.add(item1);
- set.add(item2);
- user.setItems(set);
- item2.setUser(user);
- item1.setUser(user);
- OperateDb operator = new OperateDb();
- operator.saveUser(user);
- }
- }
- 输出结果为:
- Hibernate: insert into user (username) values (?)
- Hibernate: insert into item (userId) values (?)
- Hibernate: insert into item (userId) values (?)
当把user.hbm.xml里的
xml 代码
- <set name="items" inverse="true" cascade="all" >
改为:
xml 代码
- <set name="items" inverse="false" cascade="all" >
测试类输出的结果为:
java 代码
- Hibernate: insert into user (username) values (?)
- Hibernate: insert into item (userId) values (?)
- Hibernate: insert into item (userId) values (?)
- Hibernate: update item set userId=? where id=?
- Hibernate: update item set userId=? where id=?
inverse的作用就可以很明显看出来了
3.many-to-many(学生和老师)
student.hbm.xml
xml 代码
- xml version="1.0" encoding="utf-8"?>
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.test.domain.Student" table="student" catalog="hibernate">
- <id name="id" type="java.lang.Integer">
- <column name="id" />
- <generator class="native" />
- id>
- <property name="studentname" type="java.lang.String">
- <column name="studentname" not-null="true" />
- property>
- <set name="teachers" table="teacher_student" inverse="false" cascade="all">
- <key column="student_id">key>
- <many-to-many class="com.test.domain.Teacher" column="teacher_id">many-to-many>
- set>
- class>
- hibernate-mapping>
teacher.hbm.xml
java 代码
- "1.0" encoding="utf-8"?>
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping></hibernate-mapping>
- <class name="com.test.domain.Teacher" table="teacher" catalog="hibernate">
- "id" type="java.lang.Integer">
- "id" />
- class="native" />
- "teachername" type="java.lang.String">
- "teachername" not-null="true" />
- "students" table="teacher_student" inverse="true">
- "teacher_id">
- "student_id" class="com.test.domain.Student">
- class>
测试类:
java 代码
- package com.test;
- import java.util.HashSet;
- import java.util.Set;
- import com.test.domain.Student;
- import com.test.domain.Teacher;
- public class Test {
- public static void main(String[] args){
- Student student1 = new Student();
- Student student2 = new Student();
- Teacher teacher1 = new Teacher();
- Teacher teacher2 = new Teacher();
- student1.setStudentname("student1");
- student2.setStudentname("student2");
- teacher1.setTeachername("teachername1");
- teacher2.setTeachername("teachername2");
- Set set1 = new HashSet();
- set1.add(teacher1);
- set1.add(teacher2);
- student1.setTeachers(set1);
- student2.setTeachers(set1);
- OperatorDb od = new OperatorDb();
- od.saveUser(student1);
- od.saveUser(student2);
- }
- }
- 输出结果为:
- Hibernate: insert into hibernate.student (studentname) values (?)
- Hibernate: insert into hibernate.teacher (teachername) values (?)
- Hibernate: insert into hibernate.teacher (teachername) values (?)
- Hibernate: insert into teacher_student (student_id, teacher_id) values (?, ?)
- Hibernate: insert into teacher_student (student_id, teacher_id) values (?, ?)
- Hibernate: insert into hibernate.student (studentname) values (?)
- Hibernate: insert into teacher_student (student_id, teacher_id) values (?, ?)
- Hibernate: insert into teacher_student (student_id, teacher_id) values (?, ?)