Hibernate中OneToMany映射讲解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。
UUID的配置
<id name="id" type="string" column="t_id"> <generator class="uuid"></generator> </id>
UUID的优缺点
Hibernate在保存对象时,由hibernate生成一个UUID字符串 作为主键,保证了唯一性,但其并无任何业务逻辑意 义,只能作为主键,唯一缺点长度较大,32位(Hibernate 将UUID中间的“-”删除了)的字符串, 占用存储空间大,但是有两个很重要的优点,Hibernate在维 护主键时,不用去数据库查询,从而提高效率,而且它是跨 数据库的,以后切换数据库极其方便。
OneToMany映射(List)
之前,在一对多的映射中,one方使用Set集合去关联many方,我们都知 道Set集合是无序的,而我们现在有这样的需求:one方包含的many方的 对象需要为他们编号,让它们是有序的,可能大家立刻想到使用主键ID, 但是,一方面组件ID的作用并不是编号,它是起唯一标识对象的作用, 另一方面,我们在实际的项目中,很多时候都使用UUID机制来生成和控 制ID,你不可能拿那些值来标识对象吧?也就是说,我们这个时候要单 独拿一个字段来标识many方对象的编号,而该字段又不是主键ID,不能 使用序列,那么这个时候怎么办呢?我们使用one-to-many的list机制来、 实现。
特点:uuid长度大,占用空间大,跨数据库,不用访问数据 库就生成主键值,所以效率高且能保证唯一性,移植非常方 便,推荐使用。
one-to-many(List)案例
public class Person { private int id; private String name; private int age; private Team team; }
保存
Team team=new Team(); team.setName("广州恒大"); Person p=new Person(); p.setName("可卿"); p.setAge(25); //要让p认识team,到时候外键才会有值 p.setTeam(team); //面向team做保存,同样要让team认识p team.getMembers().add(p); session.saveOrUpdate(team);
删除
删除要考虑的问题:是否级联删除 这里可分三种情况讨论: 1、没有设置cascade级联删除的情况 2、设置了cascade记录删除的情况 3、t_turn为空,外键不为空的情况。
案例描述: 假设现在有一个球队(Team),球队当中有球 员,球队和球员之间显然是一对多的关系, 现在我们一对多的list机制来实现为这些球员 编号,同时引入UUID机制。
UUID:Universally Unique Identifier,是指在一台机器上生 成的数字,它保证对在同一时空中的所有机器都是唯一的。 按照开放软件基金会(OSF)制定的标准计算,用到了以太网 卡地址、纳秒级时间、芯片ID码和许多可能的数字,标准的 UUID格式为: xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)
public class Team { private int id; private String name; List<Person> members=new ArrayList<Person>(); }
<id name="id" type="integer" column="t_id"> <generator class="sequence"> <param name="sequence">hb_team_seq</param> </generator> </id> <property name="name" type="string" column="t_name"></property> <!-- 注意:这里不能有inverse。因为最后执行的更新语句,还要设置t_turn字 段的值。 也就是说,这个时候,one方不但要维护many方的外键t_team_id,还要 维护many方的t_turn字段,这是与set集合的本质区别,因此不能像在set集合 那里那样使用inverse。这里必须要执行update。 --> <list name="members" cascade="all"> <key column="t_team_id"></key> <list-index base="0" column="t_turn"></list-index> <one-to-many class="Person"/> </list>
Hale Waihona Puke Baidu
<class name="Person" table="t_person"> <id name="id" type="integer" column="t_id"> <generator class="sequence"> <param name="sequence">hb_person_seq</param> </generator> </id> <property name="name" type="string" column="t_name"></property> <property name="age" type="integer" column="t_age"></property> <many-to-one name="team" class="Team" column="t_team_id"></many-toone> </class>