董老师在硅谷 2018-05-09
关联关系映射注解
以下项目均在之前相应代码的基础上进行的修改。这些项目均需要做的是:
删除映射文件
在hibernate.cfg.xml中注册实体类
注解的重要位置在实体类中关联属性上。这里是关联关系的体现。
举例:项目annotation_one2many_s
@OneToMany表明是一对多关联关系。
@JoinColumn指明该属性所关联的外键。
targetEntity:指明该属性所关联的类。
cascade:指定级联类型。其为数组,使用多种级联,则可使用{ }赋值。其值为Cascade常量:
对于一对多单向关联关系的多方,由于其不具备维护关联关系的能力,即没有一方对象作为属性,所以这里是不用设置关联相关的注解的。
举例:项目annotation_one2many_d
这其中增加了mappedBy属性。
mappedBy属性用法:
该属性与关联关系的维护权相关。
该属性应放在放弃维护权一方。
该属性值为对方的关联属性,表明以后的关联关系将由它来负责。
使用该属性的注解,无需也不能再设置cascade属性。
该属性只可能在双向关联中使用。
使用了该属性,将不能再使用@JoinColumn注解。因为@JoinColumn注解表示其所注解的属性将来通过set方法设值后,会与DB中哪个字段相关联。
mappedBy属性表示当前注解的关联属性放弃了维护权,即使执行了set方法将值设置入,其也不会写入到DB中。
也正因为放弃了维护权,与DB无关了,所以设置了mappedBy属性的注解,再设置cascade也就无意义了。
一个是使被注解者与DB相关,一个是使被注解者放弃与DB的关系,它们是相互矛盾的。
举例:annotation_many2many_s
多对多关联使用@ManyToMany注解。其会自动生成一个中间表,表名为两个关联对象的映射表名的联合:表1_表2。该表包含两个字段,字段名也与表名相关。字段名分别为:表1_id与表2_id。当然,默认的表名与字段名均可通过@JoinTable进行修改(不研究)。