今天在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)是不能被保存的。
相关推荐
### Hibernate Inverse 和 Cascade 的详细讲解 #### 一、引言 在ORM(Object-Relational Mapping)领域,Hibernate作为一款流行的Java持久层框架,它提供了丰富的API和配置选项来帮助开发者实现对象与数据库表之间...
在探讨Hibernate框架中的级联操作(cascade)与控制权反转(inverse)之前,我们需要先对Hibernate有一个基本的理解。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用提供了一种将对象模型映射到...
<set name="orders" cascade="all-delete-orphan" inverse="true"> <key column="CUSTOMER_ID"/> <one-to-many class="mypack.Order"/> ``` 这样,在运行时会执行: ```sql DELETE FROM ORDERS WHERE ...
在 Hibernate 框架中,`cascade` 和 `inverse` 是两个重要的概念,它们主要用于管理对象之间的持久化关系,特别是涉及到一对一(one-to-one)、一对多(one-to-many)和多对多(many-to-many)关系时。这两个属性都...
在.NET开发领域,NHibernate是一个广泛使用的对象关系映射(ORM)框架,它允许开发者将数据库操作转换为...在实际开发中,需要结合具体场景来决定何时使用`inverse="true"`和哪种`cascade`策略,以达到最佳的ORM效果。
例如,在上述的 one-to-many 示例中,`cascade="save-update"` 表示当班级(Class)对象被保存或更新时,其关联的学生(Student)对象也会被保存或更新。这意味着,如果在班级对象中添加新的学生,然后保存班级,...
1. 级联操作(Cascade):`cascade`属性用于控制级联操作,如`save-update`表示保存或更新父实体时,同时保存或更新子实体。 2. `inverse`属性:在双向关联中,如果一方负责维护关联,那么这一方的`inverse`属性设为...
总之,理解和正确使用`cascade`和`inverse`属性对于优化Hibernate应用程序的性能和数据一致性至关重要。这两个属性的组合使用可以精确地控制对象关系的生命周期管理,确保数据库中的数据与程序中的对象状态保持一致...
在软件网络技术领域,尤其是在使用Hibernate这种对象关系映射(ORM)框架时,理解和正确使用`cascade`和`inverse`属性至关重要。这两个属性主要用于管理对象之间的关联关系,特别是如何在数据库中维护这些关系。 ...
在Java的持久化框架Hibernate中,级联操作(Cascade)和反转(Inverse)是两个重要的概念,它们主要用于管理对象关系模型中的关联关系。在一对多的关系中,这些特性可以帮助简化数据操作,提高代码的可读性和维护性...
例如,在 `Classes` 类的 `student` 集合中,设置 `cascade="save-update"` 表示当保存或更新 `Classes` 实例时,其包含的 `Student` 实例也会被相应地保存或更新。 **反向属性(Inverse)** 在一对多关系中,`...
- `cascade="save-update"`:仅级联保存和更新操作。 - `cascade="delete"`:级联删除操作,但在实际应用中较少使用,因为可能引发数据丢失。 - `cascade="all"`:全级联操作,包括保存、更新和删除,适用于一对一...
例如,`cascade="save-update"`意味着当父实体被保存或更新时,其关联的子实体也会随之保存或更新。不过,`inverse`属性并不直接影响级联行为,它只是控制关联的维护权。 3. **性能影响**:选择合适的`inverse`设置...
<set name="computers" inverse="true" lazy="true" cascade="save-update"> <key column="p_id"/> <one-to-many class="Computer"/> <class name="Computer" table="Computer"> <id name="id"> ...
在Java对象持久化技术中,Hibernate是一个广泛使用的框架,它简化了数据库操作,将对象与数据库表进行映射,使得开发人员能够以面向对象的方式处理数据。在《精通Hibernate:Java对象持久化技术详解》的第4章以及后续...
`inverse="true"` 指定了关系的维护方为多方(Service),意味着 Service 对象的修改会反映到 Account 对象上。`cascade="all"` 指定了级联操作的类型,这里是全部操作。`<key>` 标签内的 `<column name="ACCOUNT_ID...
而 cascade="save-update" 则会在保存或更新父实体时,同时也保存或更新子实体。合理地使用cascade可以提高数据操作的便捷性,但过度使用可能会导致数据意外丢失。 2. **inverse属性**:inverse属性主要用于解决...
<set name="ordersSet" cascade="save-update" lazy="false"> <key column="cid"/> <one-to-many class="com.hb.st.dto.Order"/> ``` - **`name`**: 集合属性名称。 - **`cascade`**: 级联选项,如`save-update`...
<set name="orders" inverse="true" cascade="all"> <key column="customer_id"> <one-to-many class="com.suxiaolei.hibernate.pojos.Order"/> </hibernate-mapping> ``` 在上面的配置中,`<set>`元素定义...