Hibernate双向一对一关系

关系模型:
首先建两个表,一个是病人表(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

 

原文地址:https://www.cnblogs.com/hanyuan/p/2590415.html