`

对在哪用inverse="ture"?的理解

阅读更多

 

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的数据库操作不一样,但目的都是一个:维护数据的一致性。   (转)

 

我自己的理解,上代码:

Person类

 

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="org.hibernate.tutorial.domain.Person" table="PERSON">
    <id name="id" column="PERSON_ID">
        <generator class="native"/>
    </id>
    <property name="age"/>
    <property name="firstname"/>
    <property name="lastname"/>

    <set name="events" table="PERSON_EVENT" >
        <key column="PERSON_ID"/>
        <many-to-many column="EVENT_ID" class="org.hibernate.tutorial.domain.Event"/>
    </set>
	<set name="emailAddresses" table="PERSON_EMAIL_ADDR">
        <key column="PERSON_ID" />
        <element type="string" column="EMAIL_ADDR"/>
     </set>
</class>
</hibernate-mapping>
---------------------------------------------------------------------------
package org.hibernate.tutorial.domain;

import java.util.HashSet;
import java.util.Set;

public class Person {

    private Long id;
    private int age;
    private String firstname;
    private String lastname;
    private Set events = new HashSet();
    private Set emailAddresses = new HashSet();
  
    public Person() {}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getFirstname() {
		return firstname;
	}

	public void setFirstname(String firstname) {
		this.firstname = firstname;
	}

	public String getLastname() {
		return lastname;
	}

	public void setLastname(String lastname) {
		this.lastname = lastname;
	}
	
	 public Set getEvents() {
	        return events;
	    }

    public void setEvents(Set events) {
        this.events = events;
    }
    
    public Set getEmailAddresses() {
        return emailAddresses;
    }

    public void setEmailAddresses(Set emailAddresses) {
        this.emailAddresses = emailAddresses;
    }
    
    public void addToEvent(Event event) {
        this.getEvents().add(event);
        event.getParticipants().add(this);
    }

    public void removeFromEvent(Event event) {
        this.getEvents().remove(event);
        event.getParticipants().remove(this);
    }
	    

Event类

 

 

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="org.hibernate.tutorial.domain.Event" table="EVENTS" >
        <id name="id" type="java.lang.Long">
            <column name="EVENT_ID" />
            <generator class="identity" />
        </id>
        <property name="title" type="java.lang.String">
            <column name="TITLE" length="2000">
            </column>
        </property>
        <property name="date" type="java.util.Date">
            <column name="DATE"  />
        </property>
         <set name="participants" table="PERSON_EVENT" inverse="true">
            <key column="EVENT_ID"/>
            <many-to-many column="PERSON_ID" class="org.hibernate.tutorial.domain.Person"/>
        </set>
    </class>
</hibernate-mapping>


package org.hibernate.tutorial.domain;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

public class Event {

	private Long id;
	private String title;
	private Date date;
	private Set participants = new HashSet();
	
	public Event() {
	}

	public Long getId() {
		return id;
	}

	private void setId(Long id) {
		this.id = id;
	}

	public Date getDate() {
		return date;
	}

	public void setDate(Date date) {
		this.date = date;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}
	
	public Set getParticipants() {
        return participants;
    }

    public void setParticipants(Set participants) {
        this.participants = participants;
    }
    
   
}

   Person和Event 是many-to-many关系,以上两张表是由PERSON_EVENT做关联。 Event 映射文件设置了inverse="true",那么所有对表PERSON_EVENT表的新增删除更新都有由Person对象来完成。而 Event 对象上任何操作都无效(删除时候会报错)

 

分享到:
评论

相关推荐

    inverse=true的总结

    在开发中,理解并正确使用`inverse`属性对IDEA、Eclipse等开发工具的实体类生成和数据库同步功能至关重要。这些工具通常会根据`inverse`属性生成相应的SQL语句,因此理解这一特性有助于避免由工具生成的代码产生...

    JavaEE学习笔记之Hibernate表关系之一对多(inverse详解)

    1. **关联的插入和更新**:在一对多关系中,如果设置`inverse="true"`,那么在保存或更新父实体时,Hibernate会自动处理与子实体的关联,添加新的子实体或更新已存在的关联。相反,如果在子实体上操作,Hibernate将...

    NHibernate Inverse & Cascade

    在.NET开发领域,NHibernate是一个广泛使用的对象关系映射(ORM)框架,它允许开发者将数据库操作转换为...在实际开发中,需要结合具体场景来决定何时使用`inverse="true"`和哪种`cascade`策略,以达到最佳的ORM效果。

    inverse 例子

    在进行关联关系操作时,理解并合理使用`inverse`属性对于优化性能和保持数据一致性至关重要。在实际开发中,应根据业务需求和性能考虑来决定是否使用`inverse`以及如何设置。记住,良好的设计和合理的ORM配置是提高...

    hibernate inverse 个人总结.doc

    在探讨Hibernate的`inverse`属性之前,我们先要理解Hibernate中的对象关系映射(ORM)以及持久化机制。Hibernate是一个流行的Java ORM框架,它允许开发者将数据库操作转换为面向对象的编程模型,使得数据操作更加...

    Hinton在NIPS2017上关于capsules的演讲PPT:Does the Brain do Inverse Graphics?

    在NIPS 2017会议上,Geoffrey Hinton发表了一篇题为“Does the Brain do Inverse Graphics?”的演讲,该演讲主要探讨了人类视觉和capsules这两个核心主题。本文将从以下几个方面详细解释这一主题中所涉及的知识点。...

    彻底明白Hibernate中的Inverse

    `Inverse`属性主要用在双向关联中,用于指定哪个关联端负责管理关联关系的维护。默认情况下,双向关联的两端都是“负责端”,即两者都会在持久化操作时更新关联。但这样可能会导致数据冗余和一致性问题。 五、`...

    hibernate inverse和cascade的详细讲解

    - **多对多**:例如,一个`Student`和多个`Course`课程的关系,`inverse`属性通常放在独立的关系表中,并且只能在一方设置为`true`,另一方为`false`,以确保关系的正确维护。 #### 三、Cascade 属性详解 `cascade...

    inverse_c语言inverse_inverse在C_cinverse_c语言longinverse_反插值_

    在这个主题中,我们关注的是一个使用C语言实现的反插值程序,名为"inverse",它似乎对常规的反插值方法进行了优化,加入了正则化处理,以提高计算效果。 首先,让我们理解什么是反插值。在插值中,我们通常有一个...

    MVC映射inverse

    在Java的ORM框架如Hibernate中,`inverse`属性是一个关键的概念,主要用于管理一对多或多对一关联关系的主键维护。在这个例子中,我们讨论的是`inverse`在一对多双向关联关系中的应用,涉及两个实体类:`Student`和`...

    hibernate集合映射inverse和cascade详解.txt

    在Hibernate中,`inverse`属性主要用于多对一或一对多的关系中,用于指定哪一方负责维护关系。当两个实体之间存在关联时,如果一方的集合变更,那么另一方的实体可能也需要更新。这时,`inverse`属性就变得尤为重要...

    inverse和cascade使用阐述

    在数据库设计中,当我们在两个表之间建立一对多或者多对一的关系时,可能会涉及到“inverse”概念。例如,一个部门可以有多个员工,而一个员工只属于一个部门。这种情况下,员工表通常会有一个外键指向部门表。如果...

    关于cascade和inverse属性[文].pdf

    在软件网络技术领域,尤其是在使用Hibernate这种对象关系映射(ORM)框架时,理解和正确使用`cascade`和`inverse`属性至关重要。这两个属性主要用于管理对象之间的关联关系,特别是如何在数据库中维护这些关系。 ...

    hibernate 级联(cascade和inverse)一对多

    在Java的持久化框架Hibernate中,级联操作(Cascade)和反转(Inverse)是两个重要的概念,它们主要用于管理对象关系模型中的关联关系。在一对多的关系中,这些特性可以帮助简化数据操作,提高代码的可读性和维护性...

    Hibernate中cascade和inverse应用

    在 Hibernate 框架中,`cascade` 和 `inverse` 是两个重要的概念,它们主要用于管理对象之间的持久化关系,特别是涉及到一对一(one-to-one)、一对多(one-to-many)和多对多(many-to-many)关系时。这两个属性都...

    关联映射cascade,inverse讲解

    在提供的示例代码中,你将看到如何配置和使用这些特性。通过阅读和实践这些代码,你可以更深入地理解Hibernate的关联映射,掌握cascade和inverse的实际应用技巧。 总之,理解并熟练运用Hibernate的关联映射、...

    IND Inverse - MetaTrader 4脚本.zip

    在实际应用中,使用 IND Inverse Indicator 时,交易者需要将其安装到 MT4 平台上。这通常包括将 .mq4 文件复制到平台的 "Experts/Indicators" 目录下,然后在图表上选择 "Insert &gt; Indicators &gt; User Files" 来加载...

    table表格排序

    inverse = false; th.click(function(){ table.find('td').filter(function(){ return $(this).index() === thIndex; }).sortElements(function(a, b){ return parseFloat($.text([a])) &gt; parseFloat($.text...

Global site tag (gtag.js) - Google Analytics