1.cascade 表示级联操作
hibernate中一对多或者多对多中,会用到级联操作.即:有collection的一端操作,被关联的表要自动操作.
这时有collection一端需要配置cascade={CascadeType.PERSIST, CascadeType.MERGE}诸如此类的
只要在cascade的源头上插入或是删除,所有cascade的关系就会被自己动的插入或是删除。
CascadeType.PERSIST /** Cascade persist operation */ 级联刷新
只有A类新增时,会级联B对象新增。若B对象在数据库存(跟新)在则抛异常(让B变为持久态)
CascadeType.MERGE /** Cascade merge operation */ 级联更新 A类新增或者变化,会级联B对象(新增或者变化)
CascadeType.REMOVE /** Cascade remove operation */级联删除 只有A类删除时,会级联删除B类;
CascadeType.ALL /** Cascade all operations */ 包含所有;
CascadeType.REFRESH /** Cascade refresh operation */级联保存
CascadeType. DETACH /** Cascade detach operation @since Java Persistence 2.0*/
综上:大多数情况用CascadeType.MERGE就能达到级联跟新又不报错
CascadeType.REFRESH:级联刷新,当多个用户同时作操作一个实体,为了用户取到的数据是实时的,在用实体中的数据之前就可以调用一下refresh()方法!
CascadeType.REMOVE:级联删除,当调用remove()方法删除Order实体时会先级联删除OrderItem的相关数据!
CascadeType.MERGE:级联更新,当调用了Merge()方法,如果Order中的数据改变了会相应的更新OrderItem中的数据,
CascadeType.ALL:包含以上所有级联属性。
(注:以上几种级联操作,只能实在满足数据库的约束时才能生效,比如上边的Order和OrderItem存在主外键关联所以执行REMOVE()方法时是不能实现级联删除的)
CascadeType.PERSIST:级联保存,当调用了Persist() 方法,会级联保存相应的数据
2.fetch 指定加载方式
fetch=FetchType.LAZY /** Defines that data can be lazily fetched. */ 延迟加载
fetch=FetchType.EAGER /** Defines that data must be eagerly fetched. */ 急加载
3.mappedBy 与 JoinColumn
mappedBy标签一定是定义在the owned side(被拥有方的),他指向the owning side(拥有方);
只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性;
mappedBy跟JoinColumn/JoinTable总是处于互斥的一方
人跟身份证双向关联
Person:
@OneToOne(cascade={CascadeType.ALL},optional=true)
private IDCard idCard;
IDCard :
@OneToOne(cascade=CascadeType.ALL,mappedBy="idCard" , optional=false)
private Person person;
多了一个mappedBy这个方法,它表示什么呢?它表示当前所在表IDCard和Person的关系是定义在Person里面的idCard这个成员上面的,
它表示此表是一对一关系中的从表,也就是关系是在person表里面维护的 ,这一点很重要 . Person表是关系的维护者,owner side,有主导权,它有个外键指向IDCard。
我们也可以让主导权在IDCard上面,也就是让它产生一个指向Person的外键,这也是可以的,但是最好是让Person来维护整个关系,这样更符合我们正常的思维 .
我们也可以看到在Person里面IDCard是注释是optional=true,也就是说一个人是可以没有身份证的,但是一个身份证不可以没有人,所以在IDCard里面注释person的时候,optional就为false了,这样就可以防止一个空的身份证记录进数据库.
@Table(name= "promotion_info") --持久性映射的表(表名="promotion_info).@Table是类一级的注解,定义在@Entity下,为实体bean映射表,目录和schema的名字, 默认为实体bean的类名,不带包名.
@Id--注释可以表明哪种属性是该类中的独特标识符(即相当于数据表的主键)。
@GeneratedValue --定义自动增长的主键的生成策略.
@Transient --将忽略这些字段和属性,不用持久化到数据库.适用于,在当前的持久类中,某些属性不是用于映射到数据表,而是用于其它的业务逻辑需要,这时,须将这些属性进行transient的注解.否则系统会因映射不到数据表相应字段而出错.
@Temporal(TemporalType.TIMESTAMP)--声明时间格式
@Enumerated --声明枚举
@Version --声明添加对乐观锁定的支持
@OneToOne --可以建立实体bean之间的一对一的关联
@OneToMany --可以建立实体bean之间的一对多的关联
@ManyToOne --可以建立实体bean之间的多对一的关联
@ManyToMany --可以建立实体bean之间的多对多的关联
@Formula --一个SQL表达式,这种属性是只读的,不在数据库生成属性(可以使用sum、average、max等)
@OrderBy --Many端某个字段排序(List)
@OneToMany --> mappedBy:"多"方的关联属性 (被控方)
"多"方:
@ManyToOne --> @JoinColumn,"多"方定义的外键字段.
2.多对多注解:
joinColumns定义的字段,就是当前类的主键.