Hibernate注解-annotation
在Hibernate中,通常配置对象关系映射的方式有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,俗话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,annotation的方式可以更简介,使得Hibernate程序的开发大大的简化。利用注解后,可不用定义持久化类对应的*.hbm.xml,而直接以注解方式写入持久化类的实现中。在Hibernate4以后已经将annotation的jar包集成进来了,如果使用Hibernate3的版本就需要引入annotation的jar包。
常用的注解
注解 | 含义和作用 |
---|---|
@Entity | 将一个类声明为一个持久化类 |
@Id | 声明了持久化类的标识属性(相当于数据表的主键) |
@GeneratedValue | 定义标识属性值的生成策略 |
@Table | 为持久化类映射指定表(table)、目录(catalog)和schema的名称。默认值,持久化类名,不带包名 |
@UniqueConstraint | 定义表的唯一约束 |
@Lob | 表示属性将被持久化为Blob或者Clob类 |
@Column | 将属性映射到列 |
@Transient | 忽略这些字段和属性,不用持久化到数据库(不生成列) |
@OneToOne | 一对一 |
@OneToMany | 一对多 |
@ManyToOne | 多对一 |
@ManyToMany | 多对多 |
注解编写的位置
第一种是把注解@Column(name = “xx”)放在field上,一种是把注解放在get方法上一般放在field上看起来比较集中、清晰;
第二种是把注解@Column(name = “xx”)放在get方法上,这种方式看起来比较散漫、不怎么清楚。
但是第一种方式实际上破坏了java面向对象的封装性,原因是一般我们写javaBean,成员变量通常定义为private,目的就是不让别人来直接访问私有属性,而我们把注解放在私有成员的变量上,就是默认Hibernate可以直接访问我们的私有的成员变量,所以我们定义属性为private,实际就没有多大意义了,至于Hibernate为什么能访问,Hibernate采用java的反射机制完全可以访问私有成员变量!所以应该放在get方法上,第二种方式就显得更加合理。
注解实现单表
1、编写实体类
Book.java
package cn.hibernate.pojo;
import javax.persistence.*;
import java.io.Serializable;
@Entity// 表示需要持久化的实体类
@Table(name = "book") // 表示实体类所对应的表,可以不写,默认值类名
public class Book implements Serializable {
private Integer id;
private String name;
private Double price;
private String author;
@Id //主键
@GeneratedValue(strategy = GenerationType.IDENTITY) //自增
@Column(name = "id")
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
2、编写主配置文件
hibernate.cfg.xml
<!-- 添加实体类映射 -->
<mapping class="cn.hibernate.pojo.Book"/>
3、测试
@Test
public void testSave() {
Session session = null;
Transaction transaction = null;
try {
session = HibernateUtil.getSession();
transaction = session.beginTransaction();
Book book = new Book();
book.setName("红楼梦");
book.setPrice(50.5);
book.setAuthor("曹雪芹&高鹗");
session.save(book);
transaction.commit();
} catch (Exception e) {
e.printStackTrace();
transaction.rollback();
} finally {
HibernateUtil.closeSession();
}
}