Hibernate的inverse和cascade属性

4. hibernate如何根据pojo来更新数据库

4.0  在commit/flush之前,hibernate不会对pojo对象作神秘的处理。
    4.0.1 在select查询出pojo时,hibernate根据“字段--属性”的对应关系,用字段的值填充pojo的属性;
        然后根据“关系标记”生成sql语句从relationTable中查询出满足条件的relationPojo,并把这些relatinPojo
        放到“关系属性”中。这个过程是机械的。
                   
    4.0.2 在pojo对象被查出来后,到commit(或flush)之前,它将是一个普通的java对象,hibernate不会做额外的手脚。
        比如,不会限制你设置一个属性的值为null或其它任何值
             在集合类Set的add(object)操作时, 不会改变object的值,不会检查参数object是否是一个pojo对象
             设置mainPojo的一个“桥属性”的值,不会自动设置relationPojo的对应的“桥属性”的值。
             执行session.delete(pojo)时,pojo本身没有变化,他的属性值也没有变化。
             执行session.save(pojo)时,如果pojo的id不是hibernate或数据库生成,则它的值没有变化。
                                      如果pojo的id是hibernate或数据库生成,则hibernate会把id给pojo设上去。
             
        extend: 对lazy=true的set,hibernate在进行set的操作(调用java.util.Set中声明的方法)时
                会先inialize这个set,仅此而已。而inialize仅仅是从数据库中捞出set的数据。   
                如果一个set已经被inialize了,那么对它进行的操作就是java.util.Set接口中定义的语义。
               
                另外,如果id由hibernate来生成,那么在save(pojo)时,hibernate会改变该pojo,会设置它的id,这
                可能改变该pojo的hashCode,详细地讨论见帖《》
           
    mapping文件中标记的某些属性及pojo对象的操作会对数据库操作产生影响,这些影响都是在commit时才会起作用。
    而在commit前pojo的状态不受它们的影响。
   
    不过,待commit之时,将由hibernate完全掌控,它好像知道pojo对象从创建到commit这中间的所有变化。


4.01. 关联更新
    "关系标记"对应的属性是一个pojo或一个pojo的集合,修改“关系属性”的值能会导致更新mainTable表,也可能会更新relationTable表。

    这种更新暂叫“关联更新”。


4.1.inverse属性的作用(假定没有设置cascade属性)           
    4.1.1 “只有集合标记(set/map/list/array/bag)才有inverse属性”。
            ————不妨以标记set为例,具体为“一个地区(Address表)的学校(School表)” -- address.schoolSet。
               
    4.1.2 “set的inverse属性决定是否把对set的改动反映到数据库中去。
        inverse=false————反映;inverse=true————不反映”
        inverse属性默认为false
       
        对<one-to-many>和<many-to-many>子标记,这两条都适用。
        不管是对set做什么操作,4.1.2都适用。
               
    4.1.3当inverse=false时,hibernate如何将对set的改动反映到数据库中:
   
        对set的操作主要有:(1)新增元素 address.getSchoolSet().add(oneSchool);
                         (2)删除元素 address.getSchoolSet().remove(oneSchool);
                         (3)删除set  address.setSchoolSet(null);
                         (4)设新set  address.setSchoolSet( newSchoolSet);
                         (5)转移set  otherSchoolSet = otherAddress.getSchoolSet();
                              otherAddress.setSchoolSet(null);
                              address.setSchoolSet(otherSchoolSet);
                         (6)改变set中元素的属性的值  如果是改变key属性,这会导致异常
                              如果改变的是普通的属性,则hibernate认为set没有变化(在后面可以看出缘由)。
                              所以这种情形不予考虑。
                             
        改变set后,hibernate对数据库的操作根据是<one-to-many>关系还是<many-to-many>关系而有不同。
       
        对one-to-many,对school set的改动,会改变表SCHOOL中的数据:
                          #SCHOOL_ID是school表的主键,SCHOOL_ADDRESS是school表中的地址栏位
                          #表School的外键为SCHOOL_ADDRESS,它对应表Address的主键ADDRESS_ID
                         (11)insert oneSchool———— sqlInsertRowString:
                                    update SCHOOL set SCHOOL_ADDRESS=? where SCHOOL_ID=?
                                    (仅仅update foreign-key的值。)
                         (22)delete oneSchool———— sqlDeleteRowString:
                                    update SCHOOL set SCHOOL_ADDRESS=null where SCHOOL_ID=?
                                    (很奇怪,把foreign-key设置为null不知道有什么实际意义?)
                         (33)delete 属于某一address的所有school ————sqlDeleteString:
                                    update SCHOOL set SCHOOL_ADDRESS=null where SCHOOL_ADDRESS=?
                         (44)update ————sqlUpdateRowString:"", no need
                         
        对many-to-many,对school set的改动,会改变关系表ADDRESS_SCHOOL中的数据:
                        #“地区————学校”的关系为多对多的关系有点牵强,只是为了方便与上面的one-to-many作比较
                        #假设有一个关系表ADDRESS_SCHOOL,有两个字段ADDRESS_ID, SCHOOL_ID,
                        #这两个字段分别对应ADDRESS和SCHOOL两表的key
                        (11)insert的SQL语句为: insert into ADDRESS_SCHOOL(ADDRESS_ID, SCHOOL_ID)
                                                        values(?,?)
                        (22)delete的SQL语句为: delete from ADDRESS_SCHOOL
                                                        where ADDRESS_ID=? AND SCHOOL_ID=?
                        (33)delete all的SQL语句为: delete from ADDRESS_SCHOOL
                                                        where ADDRESS_ID=?
                        (44)update的sql语句为 ————sqlUpdateRowString:
                                                    update ADDRESS_SCHOOL set ADDRESS_ID=?
                                                        where ADDRESS_ID=? AND SCHOOL_ID=?
       
        对set的操作(1),hibernate会执行(11)sqlInsertRowString
        对set的操作(2),hibernate会执行(22)sqlDeleteRowString
        对set的操作(3),hibernate会执行(33)sqlDeleteString
        对set的操作(4),老的schoolSet因为没有所属的address,所以被全部delete掉,即先执行(33)sqlDeleteString
                    然后新增新的schoolSet,即再执行sqlInsertRowString
        对set的操作(5),实际上就是将set从一个pojo转移到另一pojo:
                    首先,执行sqlDeleteString,删除掉otherAddress所属的school
                    然后,执行sqlDeleteString,删除掉address原先的school
                    最后,执行sqlInsertRowString,将otherSchoolSet新增给address
   
        总结:(1)对one-to-many而言,改变set,会让hibernate执行一系列的update语句, 不会delete/insert数据
             (2)对many-to-many而言,改变set,只修改关系表的数据,不会影响many-to-many的另一方。
             (3)虽然one-to-many和many-to-many的数据库操作不一样,但目的都是一个:维护数据的一致性。执行的sql都
                只涉及到“桥字段”,不会考虑或改变其他的字段,所以对set的操作(6)是没有效果地。
                extend:对list,可能还会维护index字段。

    4.1.4 “inverse与cascade没有什么关系,互无牵扯。”
        commit后,这两个属性发挥作用的时机不同,hibernate会根据对pojo对象的改动,及cascade属性的设置,
        生成一系列的Action,比如UpdateAction,DeleteAction,InsertAction等,每个Action都有execute方法以执行对应的sql语句。
        待所有这些Action都生成好了后,hibernate再一起执行它们,在执行sql前,inverse属性起作用,
        当inverse=true时,不执行sql;当inverse=false时,执行sql。
                   
    4.1.5 inverse的默认值为false,所以inverse属性默认会进行“关联更新”。
       
    4.1.6 建议:只对set + many-to-many设置inverse=false,其他的标记不考虑inverse属性。
               糟糕的是,不设置inverse属性时,inverse默认为false。
               
4.2. 级联(cascade)属性的作用:       
    4.2.1 只有“关系标记”才有cascade属性:many-to-one,one-to-one ,any,
        set(map, bag, idbag, list, array) + one-to-many(many-to-many)
   
    4.2.2 级联指的是当主控方执行操作时,关联对象(被动方)是否同步执行同一操作。
        pojo和它的关系属性的关系就是“主控方 -- 被动方”的关系,如果关系属性是一个set,那么被动方就是set中的一个一个元素,。
        比如:学校(School)有三个属性:地区(Address),校长(TheMaster)和学生(Set, 元素为Student)
            执行session.delete(school)时,级联决定是否执行session.delete(Address),session.delete(theMaster),
            是否对每个aStudent执行session.delete(aStudent)。
       
        extend:这点和inverse属性是有区别的。见4.3.
   
    4.2.3 一个操作因级联cascade可能触发多个关联操作。前一个操作叫“主控操作”,后一个操作叫“关联操作”。
        cascade属性的可选值:
            all : 所有情况下均进行关联操作。
            none:所有情况下均不进行关联操作。这是默认值。
            save-update:在执行save/update/saveOrUpdate时进行关联操作。
            delete:在执行delete时进行关联操作。       
   
        具体执行什么“关联操作”是根据“主控操作”来的:
              “主控操作”                 “关联操作”
            session.saveOrUpdate --> session.saveOrUpdate (执行saveOrUpdate实际上会执行save或者update)
            session.save          ----> session.saveOrUpdate
            session.udpate          --> session.saveOrUpdate
            session.delete          --> session.delete
               
    4.2.4 主控操作和关联操作的先后顺序是“先保存one,再保存many;先删除many,再删除one;先update主控方,再update被动方”
        对于one-to-one,当其属性constrained="false"(默认值)时,它可看作one-to-many关系;
                       当其属性constrained="true"时,它可看作many-to-one关系;
        对many-to-many,它可看作one-to-many。
       
        比如:学校(School)有三个属性:地区(Address),校长(TheMaster,其constrained="false")和学生(Set, 元素为Student)
            当执行session.save(school)时,
            实际的执行顺序为:session.save(Address);
                            session.save(school);
                            session.save(theMaster);
                            for( 对每一个student ){
                                session.save(aStudent);
                            }
                           
            当执行session.delete(school)时,
            实际的执行顺序为:session.delete(theMaster);
                            for( 对每一个student ){
                                session.delete(aStudent);
                            }
                            session.delete(school);
                            session.delete(Address);
           
            当执行session.update(school)时,
            实际的执行顺序为:session.update(school);
                            session.saveOrUpdate(Address);
                            session.saveOrUpdate(theMaster);
                            for( 对每一个student ){
                                session.saveOrUpdate(aStudent);
                            }
            注意:update操作因级联引发的关联操作为saveOrUpdate操作,而不是update操作。
                 saveOrUpdate与update的区别是:前者根据操作对象是保存了还是没有保存,而决定执行update还是save
             
        extends: 实际中,删除学校不会删除地区,即地区的cascade一般设为false
            另外,many-to-many关系很少设置cascade=true,而是设置inverse=false。这个反映了cascade和inverse的区别。见4.3

    4.2.6 cascade的默认值为false,所以inverse属性默认会进行“关联更新”。
           
    4.2.7 总结:级联(cascade)就是操作一个对象时,对它的属性(其cascade=true)也进行这个操作。
       
       
4.3 inverse和cascade的比较
    这两个属性本身互不影响,但起的作用有些类似,都能引发对关系表的更新。
   
    4.3.1 inverse只对set+one-to-many(或many-to-many)有效,对many-to-one, one-to-one无效。
          cascade对关系标记都有效。
                     
    4.3.2 inverse对集合对象整体起作用,cascade对集合对象中的一个一个元素起作用,如果集合为空,那么cascade不会引发关联操作。
        比如将集合对象置为null, school.setStudentSet(null)
            inverse导致hibernate执行:udpate STUDENT set SCHOOL_ID=null where SCHOOL_ID=?
            cascade则不会执行对STUDENT表的关联更新, 因为集合中没有元素。
       
        再比新增一个school, session.save(school)
            inverse导致hibernate执行:
                for( 对(school的每一个student ){
                    udpate STUDENT set SCHOOL_ID=? where STUDENT_ID=? //将学生的school_id改为新的school的id
                }
            cascade导致hibernate执行:
                for( 对school的每一个student ){
                    session.save(aStudent); //对学生执行save操作
                }
       
        extends:如果改变集合中的部分元素(比如新增一个元素),
            inverse: hibernate先判断哪些元素改变了,对改变的元素执行相应的sql
            cascade: 它总是对集合中的每个元素执行关联操作。
                (在关联操作中,hibernate会判断操作的对象是否改变)
   
    4.3.2 两个起作用的时机不同:
            cascade:在对主控方操作时,级联发生。
            inverse: 在flush时(commit会自动执行flush),对session中的所有set,hibernate判断每个set是否有变化,
                    对有变化的set执行相应的sql,执行之前,会有个判断:if( inverse == true ) return;
           
        可以看出cascade在先,inverse在后。
   
    4.3.3 inverse 对set + one-to-many 和 set + many-to-many 起的作用不同。hibernate生成的sql不同。
                  对one-to-many,hibernate对many方的数据库表执行update语句。
                  对many-to-many, hibernate对关系表执行insert/update/delte语句,注意不是对many方的数据库表而是关系表。
         
          cascase 对set都是一致的,不管one-to-many还是many-to-many。都简单地把操作传递到set中的每个元素。所以它总是更新many
            方的数据库表。
           
    4.3.4 建议:只对set + many-to-many设置inverse=false,其他的标记不考虑inverse属性,都设为inverse=true。
              
               对cascade,一般对many-to-one,many-to-many,constrained=true的one-to-one 不设置级联删除。
   
OSG第三方库编译之二十一:minizip编译(Windows、Linux、Macos环境下编译) OSG编译;第三方库;跨平台编译;minizip编译(Windows、Linux、Macos环境下编译) 阅读详情

相关推荐

从零搭建SPI通信系统:AXI Quad SPI IP核在Xilinx平台上的完整配置流程

本文详细介绍了在Xilinx平台上使用AXI Quad SPI IP核从零搭建SPI通信系统的完整配置流程。涵盖IP核架构解析、Vivado环境配置、寄存器编程实战及性能优化策略,帮助开发者快速实现高速稳定的SPI通信,特别适用于嵌入式系统开发中的外围设备连接需求。

hh234的博客 1053

Hibernate中inverse属性与cascade属性

  Hibernate集合映射中,经常会使用到"inverse"和"cascade"这两个属性。对于我这样,Hibernate接触不深和语文水平够烂的种种因素,发现这两个属性实在是难以理解,无奈只好将这个两个属性解释工作交给了Google和Baidu,查看了许多牛人的解释,加上自己在Eclipse上的调试,对"inverse"和"cascade"这两个属性有了一定的见解。 "...

alva88888888的博客 251

一文说清STM32CubeMX中文汉化全流程(图解说明)

详细讲解STM32CubeMX中文汉化的完整流程,通过图文并茂的方式手把手教学,解决界面英文带来的使用障碍,让开发更高效。掌握stm32cubemx中文汉化技巧,提升嵌入式开发体验。

weixin_42499004的博客 6281

Hibernate关于inverse与cascade属性的一些理解

1.inverse 网上关于inverse的理解大都是决定主表还是从表维护关系,但这实在有点抽象,经过进行实验观察sql语句终于有了一下理解。

fengdl123的博客 3132

永磁同步电机矢量控制——电流内环前馈解耦策略

在采用永磁同步电机矢量控制时,ud和uq的指令值存在耦合项。需要对其进行解耦,目前,常用的解耦设计方法有前馈解耦、偏差解耦以及内模控制,本文主要分享电流内环前馈解耦控制策略。

a12312341ll的博客 8696

微信删除的聊天记录怎么恢复(2024年最新攻略合集)

随着微信对我们生活中方方面面的渗透,微信已然从一款简单的社交软件过渡成为现时代的一种生活方式,而微信中的聊天记录就是我们和朋友之间历程的最好证明。对此,今天我们来聊聊微信删除的聊天记录怎么恢复的问题。

m0_70960708的博客 946

hibernate中cascade属性与inverse属性概念详解

自己在学习hibernate的过程中,一直对cascade属性和inverse属性的概念模糊不清,可能很多初学者也会碰到类似情况,主要有以下几个问题: 1、cascade属性和inverse属性的作用是什么,即为什么要用他们? 2、在什么情况下使用他们? 3、如何使用他们? 对于hibernate的实体对象的配置,可能时常会用上它们,所以必须将其弄清楚明白, 于是自己通过网上查找资料以及

liuhenglucky的专栏 901

STM32G474开发板初步入门与编程实战

STM32G474开发板提供了一种快速评估、原型设计和开发STM32G474应用的方式。它搭载了STM32G474RET6微控制器,配备512KB闪存、128KB RAM,支持各种常见的接口和连接,如USB、I2C、SPI、UART等。板载ST-Link/V2-1调试器/编程器,简化了开发过程。

qq_38334677的博客 4954

hibernate 中lazy、inverse、cascade属性

在hibernate中一对多关联时会经常用到inverse和cascade属性 ,inverse 有两个值 true ,false  ;如果设置为true 则表示对象的状态变化不会同步到数据库 ;设置false就相反拉;cascade 有五个选项 分别是: all ,delete ,none,save-update,delete-orphan ;        all : 所有情况下均

小伟的程序点滴 积累 739

MOSFET雪崩特性参数解析

但是,一些电源在输出短路时,初级中会产生较大的电流,加上初级电感,器件就会有雪崩损坏的可能,因此在这样的应用条件下,就要考虑器件的雪崩能量。对于那些在MOSFET的D和S极产生较大电压的尖峰应用,就要考虑器件的雪崩能量,电压的尖峰所集中的能量主要由电感和电流所决定,因此对于反激的应用,MOSFET关断时会产生较大的电压尖峰。雪崩击穿能量标定了器件可以容忍的瞬时过冲电压的安全值,其依赖于雪崩击穿需要消散的能量。EAS单脉冲雪崩击穿能量, EAS标定了器件可以安全吸收反向雪崩击穿能量的高低。

Airer_00的博客 810

古风仙侠少女三视图提示词,一键生成角色设定

3D中国写实CG风格,CG渲染质感,精细3D建模,PBR物理材质,细腻服装纹理,电影级灯光,丰富表情,高精度场景,次世代引擎画质。平视正交视角,统一光照,纯白背景,无文字无水印,避免强透视和动态变形。3D中国写实CG风格,CG渲染质感,精细3D建模,PBR物理材质,细腻服装纹理,电影级灯光,丰富表情,高精度场景,次世代引擎画质。3D中国写实CG风格,CG渲染质感,精细3D建模,PBR物理材质,细腻服装纹理,电影级灯光,丰富表情,高精度场景,次世代引擎画质。少女,古风仙侠少女气质,灵动、温婉、仙气。

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 1081

Hibernate--inverse属性与cascade属性

转载:http://www.cnblogs.com/otomedaybreak/archive/2012/01/17/2324772.html Hibernate 集合映射中,经常会使用到"inverse"和"cascade"这两个属性。对于我这样,Hibernate接触不深和语文水平够烂的种种因素,发现这 两个属性实在是难以理解,无奈只好将这个两个属性解释工作交给了Google和...

agt30483的博客 165

GraphRAG深度解析:架构设计与实战案例

生成模块结合检索到的图数据和用户输入的查询,生成高质量的文本输出。通过结合图数据库中的知识,模型可以更准确地回答用户的问题,提供更优质的客户服务。通过分析用户的行为和偏好,结合图数据库中的知识,模型可以为用户提供个性化的推荐。:通过图数据库存储和检索结构化的知识,为语言模型提供丰富的背景信息,提升生成内容的质量和准确性。:选择合适的图数据库,如Neo4j、OrientDB等,以支持高效的图数据存储和检索。:利用图数据库的高效检索能力,快速找到与用户查询最相关的图元素,提高系统的响应速度。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1593

hibernate mysql cascade_Hibernate第五篇【inverse、cascade属性详解】

前言上一篇博文已经讲解了一对多和多对一之间的关系了,一对多和多对一存在着关联关系(外键与主键的关系)。本博文主要讲解Inverse属性、cascade属性。这两个属性对关联关系都有影响Inverse属性Inverse属性:表示控制权是否转移..true:控制权已转移【当前一方没有控制权】false:控制权没有转移【当前一方有控制权】Inverse属性,是在维护关联关系的时候起作用的。只能在“一”的...

weixin_28835789的博客 225

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Hibernate中cascade与inverse属性详解

Hibernate中cascade与inverse属性详解 关于Hibernate中 cascade 与 inverse 的理解。 您买的Hibernate书是哪一本呢? 孙卫琴的精通Hibernate,还是 深入浅出Hibernate还是那本。。。 我是两本都买了,总体来说还可以,但是,有的地方讲的比较书面化,比如inverse这属性。 在学习Hibernate的过程中最不好理解的就...

buxingzhe9898的专栏 113

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

hibernate mysql cascade_Hibernate【inverse和cascade属性】知识要点

Inverse属性Inverse属性:表示控制权是否转移..true:控制权已转移【当前一方没有控制权】false:控制权没有转移【当前一方有控制权】Inverse属性,是在维护关联关系的时候起作用的。只能在“一”的一方中使用该属性!Inverse属性的默认值为fasle,也就是当前一方是有控制权的从一下的几个方面看看Inverse在维护关联关系时是否起作用:保存数据获取数据解除关联关系删除数据对...

weixin_39967598的博客 174

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SSH框架之Hibernate的inverse属性、cascade级联操作

一、inverse属性 1、Inverse属性,是在维护关联关系的时候起作用的。 表示控制权是否转移。(只在一的一方起作用(本例中为Dept),多的一方无法使用) <!-- Dept.hbm.xml inverse=false set集合映射的默认值,表示有控制权 --> <set name="emps" inverse="false">

一点一滴 1784

Hibernate inverse属性和cascade属性

Inverse属性 Inverse属性,是在维护关联关系的时候起作用的。       表示控制权是否转移。(在一的一方起作用)   Inverse , 控制反转。 Inverse = false  不反转;   当前方有控制权                    True  控制反转; 当前方没有控制权   维护关联关系中,是否设置inverse属性:          1.保

李卫康的博客 1022

Hibernate中的Inverse和cascade属性配置

Inverse和cascade是Hibernate映射中最难掌握的两个属性。两者都在对象的关联操作中发挥作用。 1.明确inverse和cascade的作用 inverse决定是否把对对象中集合的改动反映到数据库中,所以inverse只对集合起作用,也就是只对one-to-many或many-to-many有效(因为只有这两种关联关系包含集合,而one-to-one和many-to-one只含有关系对方的一个引用)。 cascade决定是否把对对象的改动反映到数据库中,所以cascade对所有的关

王康的技术博客 1万+

Hibernate中的inverse和cascade属性

点击此处 查看原文

汤小萌的博客 282

Hibernate的Cascade和Inverse属性

Cascade:设置级联操作的程度。        Inverse:是否放弃维护级联关系。 Cascade属性的取值有: 1、none:忽略其他关联的对象,默认值。 2、save-update:当session通过save(),update(),saveOrUpdate()方法来保存或更新对象时,级联保存所有关联的新建的临时对象,并且级联更新所有关联的游离对象。 3、persist:当s

宋程铬的专栏 668

Hibernate一对多关联的两个关键属性cascade和inverse(十一)

有的时候,找了很久,才知道自己最想要的是什么。 感谢,曾经迷茫的自己,让我总结教训,让我知道我要的是什么。 日落西山你不陪,东山再起你是谁。 愿,一起安好,愿,再不相见。 上一章简单介绍了Hibernate的自身关联映射(十),如果没有看过,请观看上一章 一.Hibernate一对多配置时两个常见的关键属性。 在Hibernate的一对多配置时,有两个常见的关键属性,inverse和cascade...

两个蝴蝶飞 1304

hibernate中 dialect,lazy,inverse,cascade属性的用途?

在开发hibernate的程序时,需要进行SessionFactory的配置,简单地说,也就是建立与数据库之间连接的配置,在hibernate中一般使用xml文件来进行配置, dialect: 但是在该文件的配置中需要设置dialect方言属性值,对于不同的数据库,方言的值dialect是不同的,那么下面就列出在不同的数据库中如何设置该dialect值。常用的有 1. org.hiberna

小李大哥 899
上一篇: Hibernate2升级到Hibernate3要注意的问题(转贴)
下一篇: Hibernate3连接池配置
x98zero
博客等级 码龄22年 0粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值