关系模型:
首先建两个表,一个是病人表(patient),一个是病历表(note).一个病人对应一张病历表
patient表:
note表:
其中patinetID是外键,对应patient表的id;
建表语句如下:
patient:
CREATE TABLE `patient`
(
`id` bigint(20) NOT NULL auto_increment,
`name` varchar(20) NOT NULL,
`address` varchar(100) default NULL,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
note:
CREATE TABLE `note`
(
`id` bigint(20) NOT NULL auto_increment,
`content` varchar(1000) character set utf8 collate utf8_unicode_ci default NULL,
`patientID` bigint(20) NOT NULL,
PRIMARY KEY (`id`),
KEY `patientID` (`patientID`),
CONSTRAINT `note_ibfk_2` FOREIGN KEY (`patientID`) REFERENCES `patient` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
)
ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='InnoDB free: 3072 kB;
(`patientID`) REFER `book/patient`(`id';
对象模型:
Patient.java:
public class Patient { private long id; private String name; private String address; private Note myCase;
//省略get,set方法
Note.java:
public class Note { private long id; private String content; private Patient patientId;
//省略get,set方法
关系对象映射关系:
Patient.hbm.xml:
1 <hibernate-mapping> 2 <class name="com.sunflower.pojo.Patient" table="patient"> 3 <id name="id" type="long"> 4 <column name="id"></column> 5 <generator class="identity"></generator> 6 </id> 7 8 <property name="name" type="string"> 9 <column name="name" not-null="true"></column> 10 </property> 11 12 <property name="address" type="string"> 13 <column name="address"></column> 14 </property> 15 16 <one-to-one name="myCase" class="com.sunflower.pojo.Note" cascade="all"> 17 </one-to-one> 18 </class> 19 </hibernate-mapping>
注意第16行采用<one-to-one>对应关系,cascade="all"表示级联的模式为所有,保存,删除和修改
Note.hbm.xml:
1 <hibernate-mapping> 2 <class name="com.sunflower.pojo.Note" table="note"> 3 <id name="id" type="long"> 4 <column name="id"></column> 5 <generator class="identity"></generator> 6 </id> 7 8 <property name="content" type="string"> 9 <column name="content"></column> 10 </property> 11 12 <many-to-one name="patientId" class="com.sunflower.pojo.Patient" unique="true" fetch="join"> 13 <column name="patientID" /> 14 </many-to-one> 15 </class> 16 </hibernate-mapping>
这里注意第12行,采用的是<many-to-one>模式,但是unique="true"表示了一对一的模式,这里说明一对一其实是多对一的特例。作者个人觉得,在关系模式中作为外键的属性在映射中都采用<many-to-one>模式.
Hibernate配置文件(hibernate.cfg.xml):
1 <hibernate-configuration> 2 3 <session-factory> 4 <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 5 <property name="connection.url">jdbc:mysql://localhost:3306/book</property> 6 <property name="connection.username">yuan</property> 7 <property name="connection.password">hanyuan9113</property> 8 <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 9 <property name="myeclipse.connection.profile">mysqldriver</property> 10 <property name="show_sql">true</property> 11 <property name="current_session_context_class">thread</property> 12 13 <mapping resource="com/sunflower/pojo/Note.hbm.xml"/> 14 <mapping resource="com/sunflower/pojo/Patient.hbm.xml"/> 15 </session-factory> 16 17 </hibernate-configuration>
测试:
Test.java:
1 public class Test { 2 3 private void save() { 4 Note case1 = new Note(); 5 case1.setContent("hello"); 6 7 Patient patient1 = new Patient(); 8 patient1.setName("邓先流"); 9 patient1.setAddress("北京路23号"); 10 patient1.setMyCase(case1); 11 12 case1.setPatientId(patient1); 13 14 Session session = HibernateUtil.openSession(); 15 Transaction ts = session.beginTransaction(); 16 17 try { 18 session.delete(patient1); 19 ts.commit(); 20 } 21 catch (Exception e) { 22 e.printStackTrace(); 23 ts.rollback(); 24 } 25 finally { 26 HibernateUtil.clossFactory(); 27 } 28 } 29 30 private void delete() { 31 Session session = HibernateUtil.openSession(); 32 Transaction ts = session.beginTransaction(); 33 34 try { 35 Patient patient = (Patient) session.get(Patient.class, new Long(11)); 36 session.delete(patient); 37 ts.commit(); 38 } 39 catch (Exception e) { 40 e.printStackTrace(); 41 ts.rollback(); 42 } 43 finally { 44 HibernateUtil.clossFactory(); 45 } 46 } 47 48 public static void main(String[] args) { 49 Test test = new Test(); 50 test.delete(); 51 } 52 }
这个项目遇到的问题需要注意:
本来对象模型中的Note为Case,在插入的时候出现了sql语法错误提示,应该是case是作为关键字,影响到sql语句,后来将表名和对象名改为Note之后问题就解决了。
项目源码地址:http://115.com/file/benvyvql#onetoone.rar