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

cascade="save-update" 与 inverse="true"使用讲解(回钦波)

阅读更多

今天在hibernate-hbm.xml里面做了调试发现casecade 和 inverse 的用法所在:

 

 

1.

 

public class FlowForm {
 private int id;
 private String template;
 private Set fields;
 
 
 public Set getFields() {
  return fields;
 }
 public void setFields(Set fields) {
  this.fields = fields;
 }
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getTemplate() {
  return template;
 }
 public void setTemplate(String template) {
  this.template = template;
 }
 

 

 

public class FormField {
 private int id;
 /**
  * 表单域类型
  */
 private FieldType fieldType;
 /**
  *表单输域入类型
  */
 private FieldInput fieldInput;
 /**
  * 表单域名称
  */
 private String fieldName;
 /**
  * 表单域标签
  */
 private String fieldLabel;
 /**
  * 表单
  * @return
  */
 private FlowForm flowForm;
 /**
  * 表单域items
  * @return
  */
 private List<FieldItem> items;
 
 
 public List<FieldItem> getItems() {
  return items;
 }
 public void setItems(List<FieldItem> items) {
  this.items = items;
 }
 public FieldInput getFieldInput() {
  return fieldInput;
 }
 public void setFieldInput(FieldInput fieldInput) {
  this.fieldInput = fieldInput;
 }
 public FlowForm getFlowForm() {
  return flowForm;
 }
 public void setFlowForm(FlowForm flowForm) {
  this.flowForm = flowForm;
 }
 public String getFieldLabel() {
  return fieldLabel;
 }
 public void setFieldLabel(String fieldLabel) {
  this.fieldLabel = fieldLabel;
 }
 public String getFieldName() {
  return fieldName;
 }
 public void setFieldName(String fieldName) {
  this.fieldName = fieldName;
 }
 public FieldType getFieldType() {
  return fieldType;
 }
 public void setFieldType(FieldType fieldType) {
  this.fieldType = fieldType;
 }
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }

 

 测试:

 

Session session = null;
  session =HibernateUtils.getSession();
  session.beginTransaction();
  FlowForm flowForm = new FlowForm();
  flowForm.setTemplate("楼中阁");
  
 
  FormField field1 = new FormField();
  field1.setFieldLabel("姓名:回钦波");
  field1.setFieldName("name");
  
  
  FormField field2 = new FormField();
  field2.setFieldLabel("姓名2::回钦波");
  field2.setFieldName("name2");
  
  
  FormField field3 = new FormField();
  field3.setFieldLabel("姓名3::回钦波");
  field3.setFieldName("name3");
  
  
  FormField field4 = new FormField();
  field4.setFieldLabel("姓名4::回钦波");
  field4.setFieldName("name4");
  
  Set<FormField> set = new HashSet<FormField>();
  set.add(field1);
  set.add(field2);
  set.add(field3);
  set.add(field4);
  
  flowForm.setFields(set);
  session.save(flowForm);
  
  session.getTransaction().commit();
  
  if(session.getTransaction().isActive()){
   session.getTransaction().wasRolledBack();
  }
  HibernateUtils.closeSession(session);
  

 

配置文件:

1.

 

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
  <class table="T_FormField" name="com.nqyw.oa.model.FormField">
    <id name="id">
      <generator class="native"/>
    </id>
    <property name="fieldName"/>
    <property name="fieldLabel"></property>
    <many-to-one name="fieldType"></many-to-one>
    <many-to-one name="fieldInput"></many-to-one>
    <many-to-one name="flowForm"></many-to-one>
    <list table="T_FieldItem" name="items">
       <key column="formfieldId"></key>
       <list-index column="itemIndex"></list-index>
       <composite-element class="com.nqyw.oa.model.FieldItem">
          <property name="label"></property>
          <property name="value"></property>
       </composite-element>
    </list>
  </class>
</hibernate-mapping>

2.

 

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
  <class table="T_FlowForm" name="com.nqyw.oa.model.FlowForm">
    <id name="id">
      <generator class="native"/>
    </id>
    <property name="template"/>
    <set inverse="true" cascade="save-update"  name="fields">
        <key column="flowformId"></key>
        <one-to-many class="com.nqyw.oa.model.FormField"/>
    </set>
  </class>
</hibernate-mapping>

 

如果有:cascade="save-update" 和 inverse="true" ,表示我父(FlowForm.java)爸爸要负责维护子的关系,

SQL语句是:

Hibernate: insert into T_FormField (fieldName, fieldLabel, fieldType, fieldInput, flowForm) values (?, ?, ?, ?, ?)
Hibernate: insert into T_FormField (fieldName, fieldLabel, fieldType, fieldInput, flowForm) values (?, ?, ?, ?, ?)
Hibernate: insert into T_FormField (fieldName, fieldLabel, fieldType, fieldInput, flowForm) values (?, ?, ?, ?, ?)
Hibernate: insert into T_FormField (fieldName, fieldLabel, fieldType, fieldInput, flowForm) values (?, ?, ?, ?, ?)

如果没有cascade="save-update",的话,保存父(FlowForm.java)时 子类(FormField.java)是不能被保存的

 

 

------------------------------------------------------

如果有 :cascade="save-update" 而没有 inverse="true" ,表示我父(FlowForm.java)爸爸要负责维护子的关系,

SQL语句是:

Hibernate: insert into T_FlowForm (template) values (?)
Hibernate: insert into T_FormField (fieldName, fieldLabel, fieldType, fieldInput, flowForm) values (?, ?, ?, ?, ?)
Hibernate: insert into T_FormField (fieldName, fieldLabel, fieldType, fieldInput, flowForm) values (?, ?, ?, ?, ?)
Hibernate: insert into T_FormField (fieldName, fieldLabel, fieldType, fieldInput, flowForm) values (?, ?, ?, ?, ?)
Hibernate: insert into T_FormField (fieldName, fieldLabel, fieldType, fieldInput, flowForm) values (?, ?, ?, ?, ?)
Hibernate: update T_FormField set flowformId=? where id=?
Hibernate: update T_FormField set flowformId=? where id=?
Hibernate: update T_FormField set flowformId=? where id=?
Hibernate: update T_FormField set flowformId=? where id=?

多了四条是因为父类这边在添加完父子下,还要更新管理下子类。所以最好加上  inverse="true"。这样会提高效率

如果没有cascade="save-update",的话,保存父(FlowForm.java)时 子类(FormField.java)是不能被保存的

2
3
分享到:
评论

相关推荐

    hibernate inverse和cascade的详细讲解

    ### Hibernate Inverse 和 Cascade 的详细讲解 #### 一、引言 在ORM(Object-Relational Mapping)领域,Hibernate作为一款流行的Java持久层框架,它提供了丰富的API和配置选项来帮助开发者实现对象与数据库表之间...

    Hibernate_级联关系说明_-_关于cascade和inverse的用法

    在探讨Hibernate框架中的级联操作(cascade)与控制权反转(inverse)之前,我们需要先对Hibernate有一个基本的理解。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用提供了一种将对象模型映射到...

    hibernate_配置cascade_及all-delete-orphan.doc

    &lt;set name="orders" cascade="all-delete-orphan" inverse="true"&gt; &lt;key column="CUSTOMER_ID"/&gt; &lt;one-to-many class="mypack.Order"/&gt; ``` 这样,在运行时会执行: ```sql DELETE FROM ORDERS WHERE ...

    Hibernate中cascade和inverse应用

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

    NHibernate Inverse & Cascade

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

    Hibernate中cascade与inverse属性详解

    例如,在上述的 one-to-many 示例中,`cascade="save-update"` 表示当班级(Class)对象被保存或更新时,其关联的学生(Student)对象也会被保存或更新。这意味着,如果在班级对象中添加新的学生,然后保存班级,...

    Hibernate一对多映射配置详解

    1. 级联操作(Cascade):`cascade`属性用于控制级联操作,如`save-update`表示保存或更新父实体时,同时保存或更新子实体。 2. `inverse`属性:在双向关联中,如果一方负责维护关联,那么这一方的`inverse`属性设为...

    Hibenate cascade

    总之,理解和正确使用`cascade`和`inverse`属性对于优化Hibernate应用程序的性能和数据一致性至关重要。这两个属性的组合使用可以精确地控制对象关系的生命周期管理,确保数据库中的数据与程序中的对象状态保持一致...

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

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

    hibernate 级联(cascade和inverse)一对多

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

    Hibernate级联操作.docx

    例如,在 `Classes` 类的 `student` 集合中,设置 `cascade="save-update"` 表示当保存或更新 `Classes` 实例时,其包含的 `Student` 实例也会被相应地保存或更新。 **反向属性(Inverse)** 在一对多关系中,`...

    hibernate 学习笔记3

    - `cascade="save-update"`:仅级联保存和更新操作。 - `cascade="delete"`:级联删除操作,但在实际应用中较少使用,因为可能引发数据丢失。 - `cascade="all"`:全级联操作,包括保存、更新和删除,适用于一对一...

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

    例如,`cascade="save-update"`意味着当父实体被保存或更新时,其关联的子实体也会随之保存或更新。不过,`inverse`属性并不直接影响级联行为,它只是控制关联的维护权。 3. **性能影响**:选择合适的`inverse`设置...

    Hibernate一对多关系的处理.doc

    &lt;set name="computers" inverse="true" lazy="true" cascade="save-update"&gt; &lt;key column="p_id"/&gt; &lt;one-to-many class="Computer"/&gt; &lt;class name="Computer" table="Computer"&gt; &lt;id name="id"&gt; ...

    Hibernate笔记.doc

    在Java对象持久化技术中,Hibernate是一个广泛使用的框架,它简化了数据库操作,将对象与数据库表进行映射,使得开发人员能够以面向对象的方式处理数据。在《精通Hibernate:Java对象持久化技术详解》的第4章以及后续...

    java开始面试的第27天.doc

    `inverse="true"` 指定了关系的维护方为多方(Service),意味着 Service 对象的修改会反映到 Account 对象上。`cascade="all"` 指定了级联操作的类型,这里是全部操作。`&lt;key&gt;` 标签内的 `&lt;column name="ACCOUNT_ID...

    Hibernate开发租房系统2 源码

    而 cascade="save-update" 则会在保存或更新父实体时,同时也保存或更新子实体。合理地使用cascade可以提高数据操作的便捷性,但过度使用可能会导致数据意外丢失。 2. **inverse属性**:inverse属性主要用于解决...

    hibernate配置文件

    &lt;set name="ordersSet" cascade="save-update" lazy="false"&gt; &lt;key column="cid"/&gt; &lt;one-to-many class="com.hb.st.dto.Order"/&gt; ``` - **`name`**: 集合属性名称。 - **`cascade`**: 级联选项,如`save-update`...

    Hibernate关联关系配置

    &lt;set name="orders" inverse="true" cascade="all"&gt; &lt;key column="customer_id"&gt; &lt;one-to-many class="com.suxiaolei.hibernate.pojos.Order"/&gt; &lt;/hibernate-mapping&gt; ``` 在上面的配置中,`&lt;set&gt;`元素定义...

Global site tag (gtag.js) - Google Analytics