• 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

     

  • 相关阅读:
    从列表中或数组中随机抽取固定数量的元素组成新的数组或列表
    wangEditor
    vue.js提交按钮时简单的if判断表达式示例
    vue.js代码开发最常见的功能集合
    vue2.0实现银行卡类型种类的选择
    如何运行vue项目(维护他人的项目)
    手把手教你用vue-cli构建一个简单的路由应用
    解决eclipse端口被占用的问题
    安装依赖包时--save-dev以及-save的区别及意义
    什么是javascript-SourceMap
  • 原文地址:https://www.cnblogs.com/hanyuan/p/2590415.html
Copyright © 2020-2023  润新知