-
Hibernate保存子表更新父表0
现在有两个对象 一个是模型对象 一个模型属性对象 他们的关系是1对多的关系
模型对象如下:
public class Model implements java.io.Serializable { private String modelId; //模型ID private String modelName; //模型名称 private Set mapRelation = new HashSet(0); //映射关系 private Set modelProperties = new HashSet(0); //模型属性 public Model() { } public Model(String modelId) { this.modelId = modelId; } public Model(String modelId, String modelName, Set mapRelation, Set modelProperties) { this.modelId = modelId; this.modelName = modelName; this.mapRelation = mapRelation; this.modelProperties = modelProperties; } public String getModelId() { return modelId; } public void setModelId(String modelId) { this.modelId = modelId; } public String getModelName() { return modelName; } public void setModelName(String modelName) { this.modelName = modelName; } public Set getMapRelation() { return mapRelation; } public void setMapRelation(Set mapRelation) { this.mapRelation = mapRelation; } public Set getModelProperties() { return modelProperties; } public void setModelProperties(Set modelProperties) { this.modelProperties = modelProperties; } }
模型属性:
public class ModelProperties implements java.io.Serializable { private String modelPropertId; //模型属性ID private Model model; //模型 private String propertName; //属性名 private String propertType; //属性类型 public ModelProperties() { } public ModelProperties(String modelPropertId) { this.modelPropertId = modelPropertId; } public ModelProperties(String modelPropertId, Model model, String propertName, String propertType) { this.modelPropertId = modelPropertId; this.model = model; this.propertName = propertName; this.propertType = propertType; } public String getModelPropertId() { return modelPropertId; } public void setModelPropertId(String modelPropertId) { this.modelPropertId = modelPropertId; } public Model getModel() { return model; } public void setModel(Model model) { this.model = model; } public String getPropertName() { return propertName; } public void setPropertName(String propertName) { this.propertName = propertName; } public String getPropertType() { return propertType; } public void setPropertType(String propertType) { this.propertType = propertType; } }
他们的hbm.xml文件如下
<hibernate-mapping> <class name="com.carnation.domain.Model" table="T_QO_MODEL" > <id name="modelId" type="java.lang.String" unsaved-value="null"> <column name="MODELID" length="64" /> <generator class="uuid.hex"></generator> </id> <many-to-one name="rule" cascade="all" class="com.carnation.domain.Rule" fetch="select"> <column name="RULEID" length="64" /> </many-to-one> <property name="modelName" type="java.lang.String" > <column name="NAME" length="20" /> </property> <set name="mapRelation" inverse="true"> <key> <column name="MODELID" length="64" /> </key> <one-to-many class="com.carnation.domain.MapRelation" /> </set> <set name="modelProperties" inverse="false"> <key> <column name="MODELID" length="64" /> </key> <one-to-many class="com.carnation.domain.ModelProperties" /> </set> </class> </hibernate-mapping>
<hibernate-mapping> <class name="com.carnation.domain.ModelProperties" table="T_QO_PROPERTIES" > <id name="modelPropertId" type="java.lang.String" unsaved-value="null"> <column name="MODELPROID" length="64" /> <generator class="uuid.hex"></generator> </id> <many-to-one name="model" cascade="all" class="com.carnation.domain.Model" fetch="select"> <column name="MODELID" length="64" /> </many-to-one> <property name="propertName" type="java.lang.String"> <column name="NAME" length="20" /> </property> <property name="propertType" type="java.lang.String"> <column name="TYPE" length="20" /> </property> <set name="propertSqlcolMap" inverse="true"> <key> <column name="MODELPROID" length="64" /> </key> <one-to-many class="com.carnation.domain.PropertSqlcolMap" /> </set> </class> </hibernate-mapping>
我想在保存模型属性对象的时候 设置模型属性对象表的模型ID为8a8080a637ab74950137ab7499c30002,其中模型表已经存在id为8a8080a637ab74950137ab7499c30002的记录 也就是我想保存模型属性对象的时候 不需要更新模型表 因为如果更新模型表的话 会导致模型表id为8a8080a637ab74950137ab7499c30002的记录别的字段为空 我应该怎么写才能到达效果或者怎么配置,下面是我的测试代码
public void testSave() { ModelProperties mp = new ModelProperties(); mp.setPropertName("用户名"); Model model = new Model(); model.setModelId("8a8080a637ab74950137ab7499c30002"); //model = (Model)ruleDao.load("8a8080a637ab74950137ab7499c30002"); //难道只能用这种方式吗?这样感觉不太适合吧 mp.setModel(model); ruleDao.saveEntity(mp); }
2012年6月02日 14:05
目前还没有答案
相关推荐
1. `save-update`:当保存或更新父实体时,会自动保存或更新所有关联的子实体。 2. `merge`:在调用`session.merge()`时,不仅合并父实体的状态,也会处理所有关联的子实体。 3. `delete`:删除父实体时,会同时删除...
在数据库设计中,"父亲"和"孩子"的概念通常对应于实体之间的关联关系,例如,一个部门(父)可以有多个员工(子),或者一个员工(父)可以属于一个部门(子)。在Hibernate中,这种关系可以通过配置XML映射文件或...
级联保存时,只需要保存父对象,Hibernate会自动保存关联的子对象;级联删除则可以删除父对象时,同时删除所有关联的子对象。 5. **性能优化**:在实际应用中,为提高性能,可以采用懒加载(Lazy Loading)减少不必...
1. **关联的插入和更新**:在一对多关系中,如果设置`inverse="true"`,那么在保存或更新父实体时,Hibernate会自动处理与子实体的关联,添加新的子实体或更新已存在的关联。相反,如果在子实体上操作,Hibernate将...
在一对多关系中,通常先保存父实体(“一”的一方),再保存子实体(“多”的一方),并设置它们之间的引用关系。 - 查询数据时,可以使用Session的`load()`或`get()`方法获取实体,也可以使用HQL(Hibernate Query...
例如,CascadeType.REMOVE会删除父实体时同时删除子实体。 3. 手动处理:在某些情况下,可能需要手动调用Session的delete()方法来删除关联实体。 三、源码理解 理解Hibernate如何处理关联关系解除,需要查看其内部...
通常,Hibernate会在子实体(Order)的表中创建一个引用父实体(User)主键的外键。 在配置文件(如hibernate.cfg.xml或application.yml)中,我们需要设置实体的映射文件或使用注解扫描来告诉Hibernate这些实体的...
- 当你保存或更新一个子实体时,如果启用了级联操作,Hibernate会自动处理与之关联的父实体,确保数据的一致性。 7. **级联删除**: - 要小心使用`CascadeType.DELETE`,因为它可能导致意外删除。如果一个父实体...
在进行级联保存时,先保存或更新父对象,然后是子对象,确保关联关系的正确建立。 4. **性能考虑**:虽然级联操作方便,但如果不小心可能会导致大量的数据库操作,影响性能。因此,在实际使用中,需要根据业务需求...
1. 插入数据时,先创建父实体,然后在子实体中设置父实体的引用,最后保存子实体。Hibernate会自动处理外键的插入。 2. 查询时,可以从父实体获取所有子实体的集合,也可以从子实体查询其父实体。 3. 更新和删除时...
@Cascade注解可以设置级联操作,如保存父对象时自动保存子对象。 综上所述,"hibernate相关jar包"提供了开发Java应用程序所需的所有基本组件,使开发者能够充分利用Hibernate的优势,简化数据库操作,提高开发效率...
项目中的源码将展示如何使用Hibernate保存、更新、查询和删除数据。这包括了如何添加新的关联对象,如何更新已存在的关联,以及如何查询和删除数据。 通过详细研究**hibernate_second**项目,开发者不仅可以掌握...
10. **实体的级联操作**:级联操作允许在一个操作中处理关联的对象,例如,当删除一个父对象时,可以选择同时删除所有子对象。 以上只是《Hibernate 3.2 官方中文参考手册》中的一部分内容,实际文档中还包括了更多...
例如,`CascadeType.PERSIST` 表示当保存父实体时也自动保存其子实体。 ##### 映射策略 Hibernate 提供了多种不同的映射策略来处理一对多和多对多关系: - **表关联**:通过额外的关联表来维护关系。 - **外键关联*...
7. **事件监听器**:Hibernate 3.5支持事件监听机制,允许开发者注册监听器来拦截特定的持久化操作,如保存、更新、删除等,从而实现自定义的业务逻辑。 8. **级联操作**:在关联映射中,可以设置级联操作,比如在...
12. **级联操作**:通过`@Cascade`可以配置级联操作,如在删除父对象时,是否同时删除子对象。 13. ** Hibenate Validator**:Hibernate 还集成了Validator框架,用于校验实体对象的属性值,提供了一套强大的验证...
2. **Session**: Session是与数据库交互的主要接口,它实现了事务管理和对象的保存、更新、删除等操作。Session也负责对象的加载和查询,以及缓存管理。 3. **Criteria API**: Hibernate 3.0引入了Criteria API,...
这里,`propertyName`是Java对象中的集合属性名,`inverse="true"`表示子表的维护由父表负责,`key column`是外键列名,`one-to-many`指定与bag关联的实体类。 2. **注解映射**:如果使用注解,映射将在Java实体类...
5. **会话(Session)**:Session是Hibernate的主要工作接口,负责在应用程序和数据库之间进行交互,它提供了对象的保存、更新、删除和查询等操作。 6. **查询语言(HQL)**:Hibernate Query Language,类似SQL,...
接下来,将介绍如何进行基本的CRUD操作:保存(Save)、更新(Update)、删除(Delete)和查询(Query)。基本查询可以通过Criteria API或HQL(Hibernate Query Language)实现,它们都提供了面向对象的方式来检索...