1.属性为基本数据类型时:
@entity表示该pojo为一个实体bean
@table指定持久化类所映射的表,name指定了表的名称
@id表示该字段为主键
@generatedvalue表示生成策略这里用的是自增策略
@column给字段命名
2.当属性中有集合属性时
@elementcollection指明了集合属性的类型,此处为string类型
@collectiontable指明了保存集合的表(因为集合属性需要保存到另一个数据表中),name为表的名称,joincolumns是用来映射外键的,这里以person表的id为外键映射,即一个person对应多个学校的名称,nullable表示该列是否为空
@column指明了集合元素的列名
@ordercolumn指明了集合元素索引的列,由于list是有序的因此需要该注解,name为数据库字段的名字,假如list添加了三个string,当save(person)后则school中有三条记录,也就是一条person对应着三条记录,id列为person的id,school_name为添加的string,list_order为0,1,2
注意:关联持久化类也就是person的外键类和集合元素索引列也就是ordercolumn为school的联合主键
当集合为set时,把@ordercolumn去掉就行其他的不变因为set是无序的
3.当属性有其他pojo对象时
(1).第一种情况:当组件属性只有基本数据类型时
持久化类:
Pojo对象:
在持久化类plane中有个plane对象它不是基本数据类型,而是一个自定义类,因此无法使用@column注解来映射该属性。使用@embeddable注解来指明修饰的类是作为持久化类的组件使用,另外在passenager中有个plane对象owner使用@parent主键表明它指向包含passenager的持久化类即plane,plane表会将组件的属性作为列字段插入,因此生成的数据表将有两个字段id和pass_name.
(2).当组件属性有集合时:
也就是passenger中private List<String> schools= new ArrayList<String>();
这里不详细说明了就和2的情况一样,在schools上加上那几个注解就可以,其他的和(1)一样不变
(3).当持久化类中有集合,且集合类型为组件时
也就是plane中有private List<Passenager> passes = new ArrayList<Passenager>();
或private Map<String,Passenager> passes = new HashMap<String,Passenager>();
也很简单只要加入2的那几个注解然后删除@column即可因为之前说过组件无法用@column来映射,组件类的注解不需要变
(4)当组件作为map的key时,(3)是组件作为map的value:
Plane的注解是一样的写不贴出来了,就这四个@elementcollection--value的类型,@collectiontable,@column--映射value的字段,@mapkeyclass--映射key的类型
注意,此时需要重写passenager的equals和hashcode方法