• Hibernate高级应用


    • 数据模型与领域模型的关系
      • 领域模型是一个分析模型,它帮助需求分析人员、用户认识现实业务的工具,描述的是业务中设计的试题及其相互之间的关系,它是需求分析的产物。领域模型是需求分析人员与用户交流的有力工具,是需求分析人员与用户共同理解的概念,是彼此间交流的语言。
      • 而数据模型是系统设计、实现的一部分,描述的是用户需求在数据结构上的实现。
      • 数据模型中的概念模型设计与领域模型类似,缺乏的是实体之间更广泛的描述。领域模型设计期间不用考虑数据的管理问题,只需考虑业务描述中涉及的实体与实体之间的关系。
    • 多对一单向关联
    • 多对一双向关联
    • 一对一主键关联
    • 一对一外键关联
    • 多对多关联关系:需要通过另外一张表保存多对多的映射关系
    • 级联操作:数据库操作中常常利用主外键约束来保护数据操作的一致性。例如,在公民表和身份证表的一对一关系中,单独删除公民表中的某条公民信息是不被允许的,需要同时删除身份证表中关联的信息,也就是两个表的操作需要同时进行。
      • 级联操作(cascade)通常是指:当主控方执行save/update或delete操作时,关联对象(被控方)是否进行同步操作。

     

    • 实体集成关系映射
      • 继承是面向对象的重要特性,在Hibernate中是以面向对象的思想进行持久化操作的。因此在Hibernate中,数据表所映射的实体的对象也是可以存在进程关系的,
      • 3种继承映射关系:类继承树映射成一张表; 每个子类映射成一张表; 每个具体类映射成一张表;
    •   类继承树映射成一张表:
      • <!-- 类继承树的映射配置-->
        <hibernate-mapping package="com.mr.person">
            <class name="Person" table="tab_person">
                <id name="id">
                    <generator class="native"/ >
                </id>
                
                <!-- 声明一个鉴别器-->
                <discriminator column="type" type="String"/ >
                <!-- 映射自有属性-->
                <property name="name" not-null="true"/ >
                <property name="age" type="int"/ >
                <property name="sex" type="string"/ >
                <!-- 声明子类 -->
                <subClass name="student" discriminator-value="学生">
                    <property name="school">
                </subClass>
                
                <subclass name="staffer" discriminator-value="职员">
                    <property name="company">
                </subclass>
            </class>
        </hibernate>
      • 类继承树映射成一张表会时有一个特殊的限制,即那些由子类属性映射的字段,如student表中的school字段,不能有非空的限制,否则会导致Hibernate数据添加失败。
      • 创建AddPerson,在main()方法中利用session的save()方法分别保存学生实体对象和职员实体对象,关键代码如下:
      • //Hibernate的持久化操作
            session = HibernateInitialize.getsession();
            session.beginTransaction(); //事物开启
        Student student = new Student(); student.setName("小明"); student.setAge("12"); student.setSex("男"); student.setSchool("明日希望小学"); session.save(student);
        Staffer staffer
        = new Staffer("小红", 25, "女"); staffer.setCompany("明日科技"); session.save(staffer);
        session.getTransaction().commit();
        //事物提交
    •     每个子类映射成一张表:将每个子类映射成一张表,两个子类映射的表都将通过主键关联到超类映射的数据表,形成一对一的关系。  
      • <!-- 每个子类的映射配置-->
        <hibernate-mapping package="com.mr.person">
            <class name="Person" table="tab_person">
                <id name="id">
                    <generator class="native"/ >
                </id>
                
                <!-- 声明一个鉴别器-->
                <discriminator column="type" type="String"/ >
                <!-- 映射自有属性-->
                <property name="name" not-null="true"/ >
                <property name="age" type="int"/ >
                <property name="sex" type="string"/ >
                <!-- 声明子类 -->
                <joined-subclass name="Student" table="tab_student">
                    <key column="id" />
                    <property name="school" />
                </joined-subclass>
                
                <joined-subclass name="Staffer" table="tab_staffer">
                    <key column="id" />
                    <property name="company" />
                </joined-subclass>
            </class>
        </hibernate>
    •     每个具体类映射成为一张表:将每个具体类映射成一张表,每个子类的映射表中都含有继承的父类属性映射的字段
      • <!-- 每个具体类的映射配置-->
        <hibernate-mapping package="com.mr.person">
            <class name="Person" abstract="true"> 
            <!-- 由于父类不需要映射数据表,因此将abstract属性设置为true-->
                <id name="id">
                    <!-- 设置主键生成策略为手动分配,数据的ID需要在实体对象中的Setter方法中设定-->
                    <generator class="assigned"/ >
                </id>
                
                <!-- 声明一个鉴别器-->
                <discriminator column="type" type="String"/ >
                <!-- 映射自有属性-->
                <property name="name" not-null="true"/ >
                <property name="age" type="int"/ >
                <property name="sex" type="string"/ >
                <!-- 声明子类 -->
                <!-- union-subclass元素,用于将具体类映射为一张表 -->
                <union-subclass name="Student" table="tab_student">
                    <property name="school" />
                </union-subclass> 
                
                <union-subclass name="Staffer" table="tab_staffer">
                    <property name="company" />
                </union-subclass>
            </class>
        </hibernate>
  • 相关阅读:
    AQS共享锁应用之Semaphore原理
    AQS与重入锁ReetrantLock原理
    2018第23周总结
    阅读思考——被误用的敏捷和阻碍程序员成长的坏习惯
    百度云盘下载工具
    线程中断总结
    JUC包中的锁框架
    Java并发实现线程阻塞原语LockSupport
    react的类型检查PropTypes自React v15.5起已弃用,请使用prop-types
    python性能优化、内存优化、内存泄露;与其他语音比较效率如何?
  • 原文地址:https://www.cnblogs.com/little-YTMM/p/4645745.html
Copyright © 2020-2023  润新知