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`属性。 在一对多关系中,如果在多方(ManyToOne)的一端设置了`inverse="true"`,那么Hibernate将不再在多方对象保存或更新时处理关联。相反...
逆向强化学习(Inverse Reinforcement Learning, IRL)是一种机器学习方法,主要应用于复杂任务的奖励函数估计。在强化学习中,智能体通过与环境互动并收到奖励来学习最优策略。然而,在某些情况下,手动设计奖励...
在提供的"matrix inverse C.docx"文档中,很可能详细介绍了如何用C语言编写这样的程序,包括具体的算法和代码示例。你可以查看该文档以获取更具体的信息,如变量声明、函数定义和矩阵操作的逻辑流程。 此外,为了...
"nizhen.rar_matrix inverse_判断矩阵可逆_矩阵的逆_逆矩阵_逆矩阵 C"这个压缩包文件包含了关于矩阵逆计算的相关资源,特别是用C语言实现的代码。我们来详细探讨一下矩阵逆的概念及其计算方法。 矩阵是线性代数中的...
这在计算过程中可能会用到,比如初始化一个中间变量。 计算方阵逆的一种方法是使用高斯-约旦消元法,该方法通过将A和单位矩阵I放置在同一增广矩阵中,然后进行行变换,使A变为单位矩阵,同时I变为A的逆。在MATLAB中...
TF-IDF(Term Frequency-Inverse Document Frequency)是一种在信息检索和文本挖掘领域广泛使用的统计方法,用于评估一个词在文档集合中的重要性。它通过计算词频(Term Frequency, TF)和逆文档频率(Inverse ...
C#,数值计算,矩阵的行列式(Determinant)、伴随矩阵(Adjoint)与逆矩阵(Inverse)的算法与源代码。 矩阵行列式是指矩阵的全部元素构成的行列式,设A=(a)是数域P上的一个n阶矩阵,则所有A=(a)中的元素组成的行列...
3. **优化算法**:为了找到最佳参数估计,可能会用到梯度下降法、牛顿法或者拟牛顿法等优化算法的实现。 4. **反问题求解**:可能包括正则化技术,如Tikhonov正则化、LASSO正则化或者共轭梯度法,用于稳定和求解...
在本示例中,我们将深入探讨R语言在统计计算中的应用,特别是涉及到协方差阵、逆矩阵以及预测和回归分析。"例4-2的R代码.zip"包含了一个R脚本,它提供了如何在R环境中执行这些计算的实例。 首先,让我们了解协方差...
RSA算法是一种非对称加密算法,它在信息安全领域有着广泛的应用,如数字签名、数据加密等。本资源针对的是i春秋平台上的一个RSA题目,旨在帮助学习者加深对RSA算法的理解并提供解题所需的工具。 RSA算法的核心原理...
在MATLAB中设计FIR滤波器,通常会用到`fir1`或`fir2`函数。`fir1`用于设计线性相位的FIR滤波器,而`fir2`则允许非线性相位设计,但在这里我们讨论的是逆滤波器,即反向滤波器设计。 **逆FIR滤波器**的设计目的是...
在动态场景中拍摄的照片或视频可能会出现运动模糊,这是因为物体在快门开启期间持续移动,导致不同位置的像素在感光元件上的曝光时间不同。为了模拟这种效果,我们可以构建一个运动模糊模型。在这个模型中,我们假设...
**TF-IDF(Term Frequency-Inverse Document Frequency)**是一种用于评估词语在文档集合中的重要性的统计方法。TF表示词频,IDF则反映了词的稀有程度。高TF-IDF值的词语通常被认为是文档的主题关键词。 **词云图**是...
在机器人控制领域,逆运动学(Inverse Kinematics, IK)是至关重要的一个部分,它允许我们通过给定的目标位置来计算出机器人的关节角度,从而使得机器人的末端执行器(如手臂或手部)能够精确地到达该位置。...
TF-IDF(Term Frequency-Inverse Document Frequency)是一种在信息检索和自然语言处理中广泛使用的统计方法,用于评估一个词在文档集合中的重要性。它的基本思想是:如果一个词在文档中频繁出现,但在整个文档集合...
8. **指针到短整数_无符号**:在内存操作中,可能会用到指针类型,如将文本数据转换为无符号短整数的指针,以便进行数值运算。 9. **清零**:在计算过程中,可能会用到清零操作,确保变量或向量的初始状态。 10. *...
这些插值方法在C#中通常会用到数组操作、数学公式和条件判断等编程技巧。例如,对于图像处理,需要处理二维像素数组;对于距离计算,可能需要用到欧几里得距离公式;对于权重分配,需要根据距离进行适当的比例计算。...
- **IK/FK切换**:在马的建模中,会用到Inverse Kinematics (IK) 和 Forward Kinematics (FK) 的切换,以灵活控制四肢的动作。 - **骨骼绑定**:创建关节骨骼,并将其正确地绑定到模型的各个部分,确保动作传递...
伪逆(pseudo-inverse),也称为广义逆,是在线性代数中对矩阵的逆进行推广的一个概念。对于一个非方阵或者非可逆的方阵,我们无法直接定义它的逆矩阵,但可以定义伪逆,使得在某种意义上可以进行“逆运算”。最著名...