4.1.3当inverse=false时,hibernate如何将对set的改动反映到数据库中: 对set的操作主要有:(1)新增元素 address.getSchoolSet().add(oneSchool);(2)删除元素 address.getSchoolSet().remove(oneSchool);(3)删除set address.setSchoolSet(null);(4)设新set address.setSchoolSet( newSchoolSet);(5)转移set otherSchoolSet = otherAddress.getSchoolSet(); otherAddress.setSchoolSet(null); address.setSchoolSet(otherSchoolSet);(6)改变set中元素的属性的值如果是改变key属性,这会导致异常如果改变的是普通的属性,则hibernate认为set没有变化(在后面可以看出缘由)。所以这种情形不予考虑。 改变set后,hibernate对数据库的操作根据是关系还是关系而有不同。 对one-to-many,对school set的改动,会改变表SCHOOL中的数据: #SCHOOL_ID是school表的主键,SCHOOL_ADDRESS是school表中的地址栏位 #表School的外键为SCHOOL_ADDRESS,它对应表Address的主键ADDRESS_ID(11)insert oneSchool———— sqlInsertRowString: update SCHOOL set SCHOOL_ADDRESS=? where SCHOOL_ID=? (仅仅update foreign-key的值。)(22)delete oneSchool———— sqlDeleteRowString: update SCHOOL set SCHOOL_ADDRESS=null where SCHOOL_ID=?(很奇怪,把foreign-key设置为null不知道有什么实际意义?)(33)delete 属于某一address的所有school ————sqlDeleteString: update SCHOOL set SCHOOL_ADDRESS=null where SCHOOL_ADDRESS=?(44)update ————sqlUpdateRowString:"", no need 对many-to-many,对school set的改动,会改变关系表ADDRESS_SCHOOL中的数据: #“地区————学校”的关系为多对多的关系有点牵强,只是为了方便与上面的one-to-many作比较 #假设有一个关系表ADDRESS_SCHOOL,有两个字段ADDRESS_ID, SCHOOL_ID, #这两个字段分别对应ADDRESS和SCHOOL两表的key(11)insert的SQL语句为: insert into ADDRESS_SCHOOL(ADDRESS_ID, SCHOOL_ID) values(?,?)(22)delete的SQL语句为: delete from ADDRESS_SCHOOL where ADDRESS_ID=? AND SCHOOL_ID=?(33)delete all的SQL语句为: delete from ADDRESS_SCHOOL where ADDRESS_ID=?(44)update的sql语句为 ————sqlUpdateRowString: update ADDRESS_SCHOOL set ADDRESS_ID=? where ADDRESS_ID=? AND SCHOOL_ID=? 对set的操作(1),hibernate会执行(11)sqlInsertRowString对set的操作(2),hibernate会执行(22)sqlDeleteRowString