hibernate之几个关键词的学习

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了,这样就可以防止一个空的身份证记录进数据库.

 
常用的hibernate annotation标签如下:
@Entity              --注释声明该类为持久类。将一个Javabean类声明为一个实体的数据库表映射类,最好实现序列化.此时,默认情况下,所有的类属性都为映射到数据表的持久性字段.若在类中,添加另外属性,而非映射来数据库的,要用下面的Transient来注解.

@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)
 
1.一对多
 
在一对多注解中,会用到:
"一"方:
@OneToMany --> mappedBy:"多"方的关联属性 (被控方)
"多"方:
@ManyToOne --> @JoinColumn,"多"方定义的外键字段.
如数据表定义外键如下:
FOREIGN KEY (classid) REFERENCES classes(id)
则:
@JoinColumn(name= "classid"
 

2.多对多注解: 

在多对多注解中,双方都采用@ManyToMany.
其中被控方,像一对多注解中设置一样,也要设置mappedBy.
其中主控方,不像一对多注解那样,采用@joinColumn,而是采用@joinTable.如下:
@JoinTable(name="j_student_course" ,joinColumns={@JoinColumn(name="sid")},inverseJoinColumns={@JoinColumn(name="cid")})
其中,
如上所说,mappedBy,相当于inverse="true".所以,在@joinTable中的inverseJoinColumns中定义的字段为mappedBy所在类的主键.
joinColumns定义的字段,就是当前类的主键.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值