锁定老帖子 主题:父子关系及inverse 详解
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2004-08-14
什么赃数据问题?请言明
|
|
返回顶楼 | |
发表时间:2004-08-14
查询子表的时候,与子表纪录相对应得父表纪录已经被删除了,其实这是子表的纪录就属于脏数据的,可是因为业务需求,却不能够把这条记录删除的,这时候查询就会抛
出exception而不是返回一个null的父亲,这个问题我就 把它叫做脏数据问题的 |
|
返回顶楼 | |
发表时间:2004-08-15
willmac 写道 查询子表的时候,与子表纪录相对应得父表纪录已经被删除了,其实这是子表的纪录就属于脏数据的,可是因为业务需求,却不能够把这条记录删除的,这时候查询就会抛
出exception而不是返回一个null的父亲,这个问题我就 把它叫做脏数据问题的 真的看不懂,不是我不想讨论。 如果父子设置了级联删除关系,当你查询子表的时候,就根本查不到记录了。怎么会抛异常?如果你不设置级联删除,子表记录根本就没有被删除,又怎么会抛异常? |
|
返回顶楼 | |
发表时间:2004-08-15
哇,子表纪录没有删除,但父表纪录已经被删除了
难道你们不会爆这个错误的? net.sf.hibernate.UnresolvableObjectException: No row with the given identifier exists: 12, of class: jxufe.xfz.vo.Student 看来真的是有哪个地方,使我是我所没有注意的了 |
|
返回顶楼 | |
发表时间:2004-09-02
very good!
原来看还不明白,在自己不断的实践之后,豁然明白许多! |
|
返回顶楼 | |
发表时间:2004-09-09
非常感谢,对我真是场及时雨啊
|
|
返回顶楼 | |
发表时间:2004-09-24
inverse与cascade是两个不同的概念,但它们之间却有着微妙的关系。厘清这种联系的内部原因,对于关联的理解会更深。在《Hibernate in action》的3.7:Introducing associations 对这些内容进行了最本源的讲解。
结论是正确的,但思考同一个问题的角度不同,产生的效果自然不同。 |
|
返回顶楼 | |
发表时间:2004-09-27
willmac 写道 查询子表的时候,与子表纪录相对应得父表纪录已经被删除了,其实这是子表的纪录就属于脏数据的,可是因为业务需求,却不能够把这条记录删除的,这时候查询就会抛
出exception而不是返回一个null的父亲,这个问题我就 把它叫做脏数据问题的 如果两表存在父子关系, 最好在子表上建立个FK指向父表. 要不然,就会出现象你说的这种情况: 父表的数据删除了, 但它的ID还存在子表中. 而且, 不这样做的话, 基本上就是一个错误的设计. |
|
返回顶楼 | |
发表时间:2005-04-25
好文章,好久之前就看过。因为没记住 就又来看了一遍,还是觉得很不错。
|
|
返回顶楼 | |
发表时间:2005-05-02
但是怎么从父方删除子方呢?
这段代码,是希望在保存用户信息时能更新它的子表--角色表 但,这段代码可以保存新的角色不能删除去除的角色。 也就是说,保存后的结果是原角色集合与新角色集合的并集。 而不是要求的结果--只保存新角色的集合。 Set authorities = new CopyOnWriteArraySet();; for (int i=0; i<model.getRoles();.length; i++); { AuthoritiesId authoritiesId = new AuthoritiesId();; authoritiesId.setUserDetails(userDetails);; authoritiesId.setRoleDefiniens(roleDefiniensDao.loadByPrimaryKey(model.getRoles();[i]););; Authorities authority = new Authorities(authoritiesId);; authorities.add(authority);; } userDetails.setSetOfAuthorities(authorities);; session.saveOrUpdate(userDetails);; 映射文件: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> <hibernate-mapping> <!-- Auto-generated mapping file from the hibernate.org cfg2hbm engine --> <class name="demos.UserDetails" table="KYDA_USER_DETAILS"> <id name="relId" type="java.lang.Integer"> <column name="REL_ID" not-null="true" unique="true" sql-type="INTEGER" /> <generator class="native"> <param name="sequence">kyda_user_details_rel_id</param> </generator> </id> <property name="username" type="java.lang.String"> <column name="USERNAME" length="50" not-null="true" unique="true" sql-type="VARCHAR" /> </property> <property name="realname" type="java.lang.String"> <column name="REALNAME" length="50" not-null="true" sql-type="VARCHAR" /> </property> <property name="password" type="java.lang.String"> <column name="PASSWORD" length="50" not-null="true" sql-type="VARCHAR" /> </property> <property name="accountNonExpired" type="java.lang.Boolean"> <column name="ACCOUNT_NON_EXPIRED" not-null="true" sql-type="BOOLEAN" /> </property> <property name="credentialsNonExpired" type="java.lang.Boolean"> <column name="CREDENTIALS_NON_EXPIRED" not-null="true" sql-type="BOOLEAN" /> </property> <property name="accountNonLocked" type="java.lang.Boolean"> <column name="ACCOUNT_NON_LOCKED" not-null="true" sql-type="BOOLEAN" /> </property> <property name="enabled" type="java.lang.Boolean"> <column name="ENABLED" not-null="true" sql-type="BOOLEAN" /> </property> <!-- <property name="authorities" type="java.lang.String"> <column name="AUTHORITIES" length="1024" not-null="true" sql-type="VARCHAR" /> </property> --> <set name="setOfUserGroupRelation" inverse="true" cascade="all"> <key> <column name="USER_REL_ID" not-null="false" unique="true" /> </key> <one-to-many class="demos.UserGroupRelation" /> </set> <set name="setOfAuthorities" inverse="true" cascade="all"> <key> <column name="REL_ID" not-null="false" unique="true" /> </key> <one-to-many class="demos.Authorities" /> </set> </class> </hibernate-mapping> |
|
返回顶楼 | |