zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    第十四周 Leetcode 315. Count of Smaller Numbers After Self(HARD) 主席树
    POJ1050 To the Max 最大子矩阵
    POJ1259 The Picnic 最大空凸包问题 DP
    POJ 3734 Blocks 矩阵递推
    POJ2686 Traveling by Stagecoach 状态压缩DP
    iOS上架ipa上传问题那些事
    深入浅出iOS事件机制
    iOS如何跳到系统设置里的各种设置界面
    坑爹的私有API
    业务层网络请求封装
  • 原文地址:https://www.cnblogs.com/hanyuan/p/2590415.html
Copyright © 2011-2022 走看看