1.注释可以写在成员变量之上,也可以写在getter方法之上,但一定要保持统一性!
2.常用的hibernate annotation标签如下:
@Entity --注释声明该类为持久类。将一个Javabean类声明为一 个实体的数据库表映射类,最好实现序列化.
@Table(name="DAT_USER_INFO") --持久性映射的表(表名="DAT_USER_INFO).@Table是类一级的注解,定义在@Entity下,为实体bean映射表.
@Id --该标签用于标识数据实体的主键
@GeneratedValue --定义主键生成方式,通常和@ org.hibernate.annotations.GenericGenerator一同使用,用于生成主键。
@GenericGenerator --Hibernate提供的主键构造器。通常与@GeneratedValue配合使用。
@Column --用于表示实体属性对应数据库表的哪个字段。
@Transient --用于标识不在数据库表中映射的属性。(实体类有的成员属性,但数据库中没有)
@Temporal(TemporalType.TIMESTAMP)--声明时间格式
@Enumerated --声明枚举
@Version --声明添加对乐观锁定的支持
@OneToOne --可以建立实体bean之间的一对一的关联
@OneToMany --可以建立实体bean之间的一对多的关联
@ManyToOne --可以建立实体bean之间的多对一的关联
@ManyToMany --可以建立实体bean之间的多对多的关联
@Formula --一个SQL表达式,这种属性是只读的,不在数据库生成属性(可以使用sum、average、max等)
@OrderBy --Many端某个字段排序(List)
3.参数解释如下:
@table 参数:
name – 用于指定表名,表名统一用大写字母,单词之间用下划线分隔。
@column 参数:
name – 字段名,数据库中的字段名,默认为属性名,建议手工指定,字段名统一使用大写字母
nullable -boolean 值,表示该属性是否可以为空,默认为true。
insertable -boolean 值,表示该属性是否在insert语句中包含,默认为true。
updatable -boolean 值,表示该属性是否在update 语句中包含,默认为true。
length -int值,表示该属性值的长度,通常用于字符串属性,默认为255。
unique -boolean 值,表示该属性值是否建立唯一索引,默认为false。
@GeneratedValue 参数
strategy -构造方式;generator -构造器名称。
样例:
1、 由Hibernate自动生成主键:@GeneratedValue(strategy=GenerationType.AUTO)
2、 根据主指构造器生成主键:@GeneratedValue(generator="assigned")
@GenericGenerator 参数
name -构造器名称,在@GeneratedValue 中引用;strategy -构造方式。
样例:
1. 手工指定的主键:
@GeneratedValue(generator="assigned")
@GenericGenerator(name = "assigned", strategy = "assigned")
2. 从Sequence 获取主键:
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="TASK_SEQ")
@SequenceGenerator(name="TASK_SEQ",sequenceName="SEQ_GROUP_SEND_TASK")
@OneToMany,@ManyToOne,@OneToOne,@ManyToMany
Cascade { CascadeType.PERSIST (级联新建) ,CascadeType.REMOVE (级联删除),CascadeType.REFRESH (级联刷新),CascadeType.MERGE (级联更新)中选择一个或多个。,CascadeType.ALL}
fetch : 1)LAZY(默认值)采用延时加载,查询数据时,不一起查询关联对象的数据。而是当访问关联对象时(如:getStudnets()时)才触发相应的查询操作,获取关联对象数据。
2)EAGER:是在查询数据时,也直接一起获取关联对象的数据。
1>只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性;
2>mappedBy标签一定是定义在被拥有方的,他指向拥有方;
4.关于主键自动生成问题
Hibernate 能够出色地自动生成主键。其生成规则由@GeneratedValue设定的.
JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO.
TABLE:使用一个特定的数据库表格来保存主键。
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
IDENTITY:主键由数据库自动生成(主要是自动增长型) ----Oracle 不支持自增字段
AUTO:主键由程序控制。
在指定主键时,如果不指定主键生成策略,默认为AUTO。
@Id相当于@Id@GeneratedValue(strategy = GenerationType.AUTO)
@GeneratedValue(strategy = GenerationType.AUTO,generator="PROMOTION_SEQ")
@SequenceGenerator(name="PROMOTION_SEQ",sequenceName="PROMOTION_SEQ")
5.相关例子如下
1.@Formula
/** * 参与评审的商品表 * */ @Entity @Table(name = "MARKET_REVIEW_PRODUCT") @AttributeOverride(column = @Column(name = "REVIEW_PRODUCT_ID"), name = "id") public class ReviewProduct extends IdEntity { private static final long serialVersionUID = 1L; private ProductReview review; //商品评审基本信息 private Integer agreeAmount; //同意结果统计
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "REVIEW_ID") public ProductReview getReview() { return review; } public void setReview(ProductReview review) { this.review = review; } @Formula("(select count(*) from MARKET_PRODUCT_REVIEW_RESULT t where t.REVIEW_ID=REVIEW_ID and t.REVIEW_RESULT='1' )") public Integer getAgreeAmount() { return agreeAmount; } public void setAgreeAmount(Integer agreeAmount) { this.agreeAmount = agreeAmount; } }