Hibernate3.x教程(六) Hibernate常用注解

在Hibernate3.2版本之后,开始支持使用JPA注解来替代XML映射配置,自此,极大程度的简化了hibernate的配置,现在使用注解也成为了映射的首选方式。
下面,我们来学习Hibernate的常用注解。
 
一、映射实体Bean
@Entity注解可以将一个POJO映射为实体Bean,如:
@Entity
public class User {
    //.....
}
@Table注解指定映射的表,如
@Entity
@Table(name="tbl_user")
public class User {
//.....
}
@Id注解指定实体Bean的主键映射,需在getter方法上标注。
@GeneratedValue注解用于指定主键生成策略,注解支持的主键生成策略有:
AUTO -  相当于配置文件中的native,根据底层数据库自动选择使用IDENTITY、SEQUENCE、TABLE类型(默认值)
        TABLE - 使用table保存id值
        IDENTITY - 自增注解,数据库需要支持主键自动增长
        SEQUENCE - 使用序列生成
@Id通常和@GeneratedValue注解配合使用,如:
使用数据库的自增主键
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId() {
    return id;
}
使用序列生成器
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="SEQ_STORE")
public Long getId() {
    return id;
}
注:关于Hibernate注解的位置
Hibernate有两种映射字段的方式,分别为Filed和Property,对应这两种方式Hibernate分别会通过属性(Java反射)或getter方法映射字段。在使用注解的时候,@Id注解的位置决定了Hibernate的映射方式。
因此当@Id注解标注在属性字段上时,Hibernate会采用属性映射方式,此时其他注解也必须标注在属性上,否则程序会出错。@Id注解标注在getId()方法上时,也是一样的,总之所有注解的位置要保持和@Id注解位置一致。
 
二、简单属性映射
Hibernate会自动对非static、非transient的属性进行映射。
@Transient注解指定需要忽略映射的字段(该字段将不被映射到表中):
private String noMaping;

@Transient
public String getNoMaping() {
    return noMaping;
}
public void setNoMaping(String noMaping) {
    this.noMaping = noMaping;
}
@Lob注解表明属性将被映射为Blob或Clob类型,具体取决于属性的类型:java.sql.Clob,Character[],char[]和String这些类型都将映射为Clob类型,而java.sql.Blob,Byte[],byte[]和Serializable类型则被映射为Blog类型。
@Lob
public String getFullText() {
    return fullText();
}

@Lob
public byte[] getFullCode() {
    return fullCode;
}
@Column注解指定映射字段,该注解有以下属性:
   name="columnName";                       (1) 列名
   boolean unique() default false;          (2)    是否在该列上设置唯一约束
   boolean nullable() default true;         (3)   列可空?
   boolean insertable() default true;      (4) 该列是否作为生成 insert语句的一个列
   boolean updatable() default true;     (5)  该列是否作为生成 update语句的一个列
   String columnDefinition() default ""; (6)  默认值
   String table() default "";                      (7)             定义对应的表(deault 是主表)
   int length() default 255;                      (8)              列长度
   int precision() default 0;                      (9)  decimal精度
   int scale() default 0;                             (10)  decimal长度
示例:
@Column(name="flight_name", updatable=false, nullalbe=false, length=50)
public String getName(){ ... }
 
三、继承父类属性
@MappedSuperclass注解表明父类属性将被子类继承,但是父类不作为实体映射,如:
@MappedSuperclass
public abstract class IdEntity {
    protected Long id;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
}

四、映射实体Bean的关联关系
1、多对一(Many-to-One)
@ManyToOne注解表明多对一关联关系,同时可以使用@JoinColumn指定关联字段
@ManyToOne  (fetch = FetchType.LAZY)
@JoinColumn(name="company_id")  
public Company getCompany() {  
    return company;  
}
2、一对多(One-to-Many)
@OneToMany注解表明一对多关联关系
@Entity
public class Troop {
    @OneToMany(mappedBy="troop")
    public Set<Soldier> getSoldiers() {
        ...
    }
}

@Entity
public class Soldier {
    @ManyToOne
    @JoinColumn(name="troop_fk")
    public Troop getTroop() {
        ...
    }
}
3、多对多(Many-to-Many)
@ManyToMany注解表明多对多关联关系
@JoinTable 注解描述关联表和关联条件。其中一端定义为 owner, 另一段定义为 inverse
@Fetch定义Fetch策略:
    FetchMode.JOIN 会使用left join查询  只产生一条sql语句 
    FetchMode.SELECT 会产生N+1条sql语句 
    FetchMode.SUBSELECT  产生两条sql语句 第二条语句使用id in (.....)查询出所有关联的数据
@OrderBy指定集合排序方式
@Cache定义缓存策略
@ManyToMany
@JoinTable(name = "user_role", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = { @JoinColumn(name = "role_id") })
@Fetch(FetchMode.SUBSELECT)
@OrderBy("id")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public List<Role> getRoleList() {
    return roleList;
}
 
五、Hibernate命名策略
org.hibernate.cfg.ImprovedNamingStrategy的命名策略:
将按照驼峰式命名规范的类名和属性名的各单词之间添加下划线并将字符串转为小写格式。
如:
UserGroup类映射为user_group表
groupId属性映射为group_id字段
 
推荐命名规则:
1、按照编程规范对类、属性、表和字段进行命名,尽量使用命名策略自动映射。
2、不要使用"t_"、"tbl_"这样的表名前缀。
3、业务并不复杂的项目表名尽量不要使用前缀。
4、业务复杂数据库表数量过多,可以使用模块名作为表名前缀,同时实体的名称前添加对应模块名。如,表名sys_user,实体Bean命名为SysUser。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值