`
dahui12344321
  • 浏览: 247525 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

到底在哪里用到inverse

阅读更多
1、到底在哪用cascade="..."?


cascade属性并不是多对多关系一定要用的,有了它只是让我们在插入或删除对像时更方便一些,只要在cascade的源头上插入或是删除,所有 cascade的关系就会被自己动的插入或是删除。便是为了能正确的cascade,unsaved-value是个很重要的属性。Hibernate通 过这个属性来判断一个对象应该save还是update,如果这个对象的id是unsaved-value的话,那说明这个对象不是 persistence object要save(insert);如果id是非unsaved-value的话,那说明这个对象是persistence object(数据库中已存在),只要update就行了。saveOrUpdate方法用的也是这个机制。


2、到底在哪用inverse="ture"?

“set的inverse属性决定是否把对set的改动反映到数据库中去。inverse=false————反映;inverse=true————不反映”inverse属性默认为false


inverse属性默认是false的,就是说关系的两端都来维护关系。这个意思就是说,如有一个Student, Teacher和TeacherStudent表,Student和Teacher是多对多对多关系,这个关系由TeacherStudent这个表来表 现。那么什么时候插入或删除TeacherStudent表中的记录来维护关系呢?在用hibernate时,我们不会显示的对 TeacherStudent表做操作。对TeacherStudent的操作是hibernate帮我们做的。hibernate就是看hbm文件中指 定的是"谁"维护关系,那个在插入或删除"谁"时,就会处发对关系表的操作。前提是"谁"这个对象已经知道这个关系了,就是说关系另一头的对象已经set 或是add到"谁"这个对象里来了。前面说过inverse默认是false,就是关系的两端都维护关系,对其中任一个操作都会处发对表系表的操作。当在 关系的一头,如Student中的bag或set中用了inverse="true"时,那就代表关系是由另一关维护的(Teacher)。就是说当这插 入Student时,不会操作TeacherStudent表,即使Student已经知道了关系。只有当Teacher插入或删除时才会处发对关系表的 操作。所以,当关系的两头都用inverse="true"是不对的,就会导致任何操作都不处发对关系表的操作。当两端都是inverse= "false"或是default值是,在代码对关系显示的维护也是不对的,会导致在关系表中插入两次关系。


在一对多关系中inverse就更有意义了。在多对多中,在哪端inverse="true"效果差不多(在效率上)。但是在一对多中,如果要一方维护关 系,就会使在插入或是删除"一"方时去update"多"方的每一个与这个"一"的对象有关系的对象。而如果让"多"方面维护关系时就不会有update 操作,因为关系就是在多方的对象中的,直指插入或是删除多方对象就行了。当然这时也要遍历"多"方的每一个对象显示的操作修关系的变化体现到DB中。不管 怎样说,还是让"多"方维护关系更直观一些。

(1)对one-to-many而言,改变set,会让hibernate执行一系列的update语句, 不会delete/insert数据

(2)对many-to-many而言,改变set,只修改关系表的数据,不会影响many-to-many的另一方。

(3)虽然one-to-many和many-to-many的数据库操作不一样,但目的都是一个:维护数据的一致性。


3、cascade和inverse有什么区别?

可以这样理解,cascade定义的是关系两端对象到对象的级联关系;而inverse定义的是关系和对象的级联关系。

inverse只对set+one-to-many(或many-to-many)有效,对many-to-one, one-to-one无效。cascade对关系标记都有效。

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会判断操作的对象是否改变)

两个起作用的时机不同:

cascade:在对主控方操作时,级联发生。

inverse: 在flush时(commit会自动执行flush),对session中的所有set,hibernate判断每个set是否有变化,

对有变化的set执行相应的sql,执行之前,会有个判断:if( inverse == true ) return;可以看出cascade在先,inverse在后。

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、cascade和inverse有什么相同?

这两个属性本身互不影响,但起的作用有些类似,都能引发对关系表的更新。

5、 建议:只对set + many-to-many设置inverse=false,其他的标记不考虑inverse属性,都设为inverse=true。对cascade,一 般对many-to-one,many-to-many,constrained=true的one-to-one 不设置级联删除。

文章出处http://hi.baidu.com/dengwl2008/blog/item/929989f9a8aca75e242df241.html
分享到:
评论

相关推荐

    inverse 例子

    然而,有时我们可能希望将这种责任转移给另一方,这就需要用到`inverse`属性。 在一对多关系中,如果在多方(ManyToOne)的一端设置了`inverse="true"`,那么Hibernate将不再在多方对象保存或更新时处理关联。相反...

    Inverse Reinforcement Learning.pptx

    逆向强化学习(Inverse Reinforcement Learning, IRL)是一种机器学习方法,主要应用于复杂任务的奖励函数估计。在强化学习中,智能体通过与环境互动并收到奖励来学习最优策略。然而,在某些情况下,手动设计奖励...

    matrix-inverse-C.zip_C 矩阵运算_matrix inverse

    在提供的"matrix inverse C.docx"文档中,很可能详细介绍了如何用C语言编写这样的程序,包括具体的算法和代码示例。你可以查看该文档以获取更具体的信息,如变量声明、函数定义和矩阵操作的逻辑流程。 此外,为了...

    nizhen.rar_matrix inverse_判断矩阵可逆_矩阵的逆_逆矩阵_逆矩阵 C

    "nizhen.rar_matrix inverse_判断矩阵可逆_矩阵的逆_逆矩阵_逆矩阵 C"这个压缩包文件包含了关于矩阵逆计算的相关资源,特别是用C语言实现的代码。我们来详细探讨一下矩阵逆的概念及其计算方法。 矩阵是线性代数中的...

    inverse(A):方阵的逆-matlab开发

    这在计算过程中可能会用到,比如初始化一个中间变量。 计算方阵逆的一种方法是使用高斯-约旦消元法,该方法通过将A和单位矩阵I放置在同一增广矩阵中,然后进行行变换,使A变为单位矩阵,同时I变为A的逆。在MATLAB中...

    TFIDF用到所有的包

    TF-IDF(Term Frequency-Inverse Document Frequency)是一种在信息检索和文本挖掘领域广泛使用的统计方法,用于评估一个词在文档集合中的重要性。它通过计算词频(Term Frequency, TF)和逆文档频率(Inverse ...

    C#,数值计算,矩阵的行列式(Determinant)、伴随矩阵(Adjoint)与逆矩阵(Inverse)的算法与源代码

    C#,数值计算,矩阵的行列式(Determinant)、伴随矩阵(Adjoint)与逆矩阵(Inverse)的算法与源代码。 矩阵行列式是指矩阵的全部元素构成的行列式,设A=(a)是数域P上的一个n阶矩阵,则所有A=(a)中的元素组成的行列...

    Parameter Estimation and Inverse Problems, Second Edition对应的第3章代码

    3. **优化算法**:为了找到最佳参数估计,可能会用到梯度下降法、牛顿法或者拟牛顿法等优化算法的实现。 4. **反问题求解**:可能包括正则化技术,如Tikhonov正则化、LASSO正则化或者共轭梯度法,用于稳定和求解...

    例4-2的R代码.zip_R 例_R代码_inverse of matrix_用R计算协差阵

    在本示例中,我们将深入探讨R语言在统计计算中的应用,特别是涉及到协方差阵、逆矩阵以及预测和回归分析。"例4-2的R代码.zip"包含了一个R脚本,它提供了如何在R环境中执行这些计算的实例。 首先,让我们了解协方差...

    RSA2此资源为i春秋上的一道RSA的题目,里面包含题目的附件以及解题用到的工具。

    RSA算法是一种非对称加密算法,它在信息安全领域有着广泛的应用,如数字签名、数据加密等。本资源针对的是i春秋平台上的一个RSA题目,旨在帮助学习者加深对RSA算法的理解并提供解题所需的工具。 RSA算法的核心原理...

    matlab开发-inverseFIRfilter

    在MATLAB中设计FIR滤波器,通常会用到`fir1`或`fir2`函数。`fir1`用于设计线性相位的FIR滤波器,而`fir2`则允许非线性相位设计,但在这里我们讨论的是逆滤波器,即反向滤波器设计。 **逆FIR滤波器**的设计目的是...

    python实现逆滤波与维纳滤波示例

    在动态场景中拍摄的照片或视频可能会出现运动模糊,这是因为物体在快门开启期间持续移动,导致不同位置的像素在感光元件上的曝光时间不同。为了模拟这种效果,我们可以构建一个运动模糊模型。在这个模型中,我们假设...

    论文中用到的部分基础文本分析技术(包括分词、去除停用词、word2vec、TF-IDF、词云图、名称提取、词性标注、LDA主题模型)

    **TF-IDF(Term Frequency-Inverse Document Frequency)**是一种用于评估词语在文档集合中的重要性的统计方法。TF表示词频,IDF则反映了词的稀有程度。高TF-IDF值的词语通常被认为是文档的主题关键词。 **词云图**是...

    pepperInverseKinematics:胡椒机器人的逆运动学计算

    在机器人控制领域,逆运动学(Inverse Kinematics, IK)是至关重要的一个部分,它允许我们通过给定的目标位置来计算出机器人的关节角度,从而使得机器人的末端执行器(如手臂或手部)能够精确地到达该位置。...

    tf-idf分词算法

    TF-IDF(Term Frequency-Inverse Document Frequency)是一种在信息检索和自然语言处理中广泛使用的统计方法,用于评估一个词在文档集合中的重要性。它的基本思想是:如果一个词在文档中频繁出现,但在整个文档集合...

    易语言向量法计算文本相似度

    8. **指针到短整数_无符号**:在内存操作中,可能会用到指针类型,如将文本数据转换为无符号短整数的指针,以便进行数值运算。 9. **清零**:在计算过程中,可能会用到清零操作,确保变量或向量的初始状态。 10. *...

    C#双线性、临近点、反距离三种插值源代码

    这些插值方法在C#中通常会用到数组操作、数学公式和条件判断等编程技巧。例如,对于图像处理,需要处理二维像素数组;对于距离计算,可能需要用到欧几里得距离公式;对于权重分配,需要根据距离进行适当的比例计算。...

    maya建模的实例,关于马的建模过程

    - **IK/FK切换**:在马的建模中,会用到Inverse Kinematics (IK) 和 Forward Kinematics (FK) 的切换,以灵活控制四肢的动作。 - **骨骼绑定**:创建关节骨骼,并将其正确地绑定到模型的各个部分,确保动作传递...

    【90.01_02_线性代数(2)_马辉】 6 伪逆.pdf

    伪逆(pseudo-inverse),也称为广义逆,是在线性代数中对矩阵的逆进行推广的一个概念。对于一个非方阵或者非可逆的方阵,我们无法直接定义它的逆矩阵,但可以定义伪逆,使得在某种意义上可以进行“逆运算”。最著名...

Global site tag (gtag.js) - Google Analytics