当项目变得比较大的时候,如何还使用hbm.xml文件来配置Hibernate实体就会变得比较复杂。这里Hibernate提供了Annotation注解方式,使得Hibernate的映射文件变得很方便管理了。
这里简单介绍Hibernate的Annotation注解
一、声明实体
@Entity
对实体注释。任何Hibernate映射对象都要有这个注释
@Table
声明此对象映射到数据库的数据表,通过它可以为实体指定表(talbe),目录(Catalog)和schema的名字。该注释不是必须的,如果没有则系统使用默认值(实体的短类名)。
@Version
该注释可用于在实体Bean中添加乐观锁支持。
二、声明主键
@Id
声明此属性为主键。该属性值可以通过应该自身创建,但是Hibernate推荐通过Hibernate生成
@GeneratedValue
指定主键的生成策略。有如下四个值
TABLE:使用表保存id值
IDENTITY:identitycolumn
SEQUENCR :sequence
AUTO:根据数据库的不同使用上面三个
三、声明普通属性
@Column
声明该属性与数据库字段的映射关系。
@Column(nam=”category_name” length=20) Public void getCategoryName(){ Return this.categoryName; }
注意:
1、 当POJO有属性不需要映射的时候一定要用@Transitent修饰,该注释表示此属性与表没有映射关系,只是一个暂时的属性。
2、 @Lob注释表示该属性持久化为Blob或者Clob类型,具体取决于属性的类型。
@Transient
用于注释pojo对象中的属性,被注释的属性将成为短暂的,不会持久化到数据库的“短暂”属性。
四、声明关联关系
一对多关联关系
@OneToMany(mappedBy=” person”,cascade=CascadeType.ALL,fetch=FetchType.LAZY)
一对多声明
@ManyToOne(cascade=CascadeType.REFRESH,)
@JoinColumn
多对一声明 ,声明为双向关联
一对一关联关系
@OneToOne(optional= true,cascade =CascadeType.ALL, mappedBy = “person”)
一对一关联声明
@OneToOne(optional = false, cascade = CascadeType.REFRESH)
@JoinColumn(name = “Person_ID”, referencedColumnName = “personid”,unique = true)
声明为双向关联
多对多关联关系
@ManyToMany(mappedBy= “students”)
多对多关联声明。
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(name = “Teacher_Student”,
joinColumns = {@JoinColumn(name = “Teacher_ID”, referencedColumnName =“teacherid”)},
inverseJoinColumns = {@JoinColumn(name = “Student_ID”, referencedColumnName =“studentid”)})
实例:
有如下两个实体,商品:Goods,分类Category。两者是多对一的关联关系。
使用Hibernate Annotation注解如下
Goods.java
@Entity @Table(name = "goods", catalog = "test") public class Goods implements java.io.Serializable { private static final long serialVersionUID = 1L; private String goodsId; private Category category; private String goodsName; public Goods() { } /* * 主键 * 生成策略为自动增长 * 唯一、长度为20 */ @Id @GeneratedValue @Column(name = "goods_id", unique = true, nullable = false, length = 20) public String getGoodsId() { return this.goodsId; } public void setGoodsId(String goodsId) { this.goodsId = goodsId; } /* * 多对一关联关系 * 延迟加载:fetch = FetchType.LAZY * 引用外键:category_id * */ @ManyToOne(fetch = FetchType.LAZY,cascade=CascadeType.ALL) @JoinColumn(name = "category_id") public Category getCategory() { return this.category; } public void setCategory(Category category) { this.category = category; } @Column(name = "goods_name", nullable = false, length = 50) public String getGoodsName() { return this.goodsName; } public void setGoodsName(String goodsName) { this.goodsName = goodsName; } }
Category.java
@Entity @Table(name = "category", catalog = "test") public class Category implements java.io.Serializable { private static final long serialVersionUID = -1877960009126534682L; private String categoryId; private String categoryName; private Set<Goods> goodses = new HashSet<Goods>(0); public Category() { } /* * 主键 * 生成策略为自动增长 * 唯一、长度为20 */ @Id @GeneratedValue @Column(name = "category_id", unique = true, length = 10) public String getCategoryId() { return this.categoryId; } public void setCategoryId(String categoryId) { this.categoryId = categoryId; } @Column(name = "category_name", length = 20) public String getCategoryName() { return this.categoryName; } public void setCategoryName(String categoryName) { this.categoryName = categoryName; } /* * 一对多关联关系 * 级联关系:cascade=CascadeType.ALL * 延迟加载:fetch = FetchType.LAZY * 映射:mappedBy = "category" */ @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "category") public Set<Goods> getGoodses() { return this.goodses; } public void setGoodses(Set<Goods> goodses) { this.goodses = goodses; } }