Hibernate注解简介
使用注解的目的:为了简化繁琐的ORM映射文件(*.hbm)的配置。也就是做注解要做的就是ORM映射文件要做的一切工作,只是在形式上有所区别。
JPA与Hibernate的关系
什么是JPA:全称Java Persistence API。JPA注解是JAVAEE的规范和标准。
JPA和Hibernate的关系:JPA是标准接口,Hibernate是实现,但是其功能是JPA的超集。
Hibernate如何实现与JPA的关系?
通过hibernate-annotation、hibernate-entitymanager和hibernate-core三个组件来实现。
一般在实际开发中,优先考虑使用JPA注解,这样有利于程序的移植和扩展。
Hibernate注解的分类
类级别注解
属性级别注解
映射关系注解
常见的类级别注解:
@Entity,表示的是一个实体类,一个实体类就应该对应数据库当中的一张表
@Table
@Embeddable,表示是一个嵌入类
@Entity
@Entity表示映射的是一个实体类,一个实体类对应数据库中一种表。
用法:
@Entity(name=”tableName”)
name属性表示映射到数据库中的表名。是可选的,如果表名与实体类名相同,就可以省略。
注意:使用@Entity是必须指定实体类的主键属性。
引入Hibernate、mysql、junit的一些包
先创建好一个项目,设置好hibernate.cfg.xml文件
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="connection.username">root</property>
<property name="connection.password">12345678</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="connection.url">
jdbc:mysql:///hibernate?useUnicode=true&characterEncoding=UTF-8
</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">create</property>
<property name="hibernate.current_session_context_class">thread</property>
</session-factory>
</hibernate-configuration>
然后创建一个包,里边写上实体类Students,然后给这个类上边添加一个@Entity注解,这就保证这个类将来可以映射为数据库中的一张表。
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Students {
private int sid;
private String sname;
private String gender;
private Date birthday;
private String major;
private String address;
private Students(){
}
public Students(int sid, String sname, String gender, Date birthday,
String major, String address) {
//super();
this.sid = sid;
this.sname = sname;
this.gender = gender;
this.birthday = birthday;
this.major = major;
this.address = address;
}
@Id
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
其中在getId方法上要加上@Id,表示它是一个主键。
然后就要把这个类添加到配置文档中<mapping class="com.entity.Students"/>
然后要创建测试类
public class TestStudents {
@Test
public void testSchemaExport(){
//用于输出表结构
//创建配置对象
Configuration config = new Configuration().configure();
//创建服务注册对象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
//创建会话工厂对象
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
SchemaExport export = new SchemaExport(config);
export.create(true,true);//生成表结构
}
}
测试之后就可以看到在数据库中确实创建了这个students表
@Table
@Table(name=”“,catalog=”“,schema=”“)
这个注解一般有三个属性,如上所示
@Table与@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息。
name:可选,映射表的名称,默认表名与实体名称一致,只有在不一致的情况下才需要指定表名
catalog:可选,表示目录名称,默认为Catalog(“”)
schema:可选,表示模式名称,默认为Schema(“”)
一个数据库可以包含多个Catalog(目录),每一个Catalog又可以有多个Schema(模式)。每一个Schema可以包含多个数据库对象,包括表,视图,字段。
从实现的角度来看,各种数据库系统对Catalog和Schema的支持和实现方式千差万别。MySQL不支持Catalog,Schema为数据库名称。
在之前的例子中,可以在@Entity之后再加上注解@Table(name=”t_students”,schema=”hibernate”)
@Embeddable
@Embeddable表示一个非Entity类可以嵌入到另一个Entity类中作为属性而存在
可以新建一个Address类,里边增加几个字段并且封装。
@Embeddable
public class Address {
private String postCode;
private String address;
private String phone;
public String getPostCode() {
return postCode;
}
public void setPostCode(String postCode) {
this.postCode = postCode;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
加上@Embeddable表示它是一个嵌入类,在其他类中充当一个属性。
把Students实体中把基本类型的address删掉,新增组件类型的Address
private Address add;
修改构造方法中的参数并且将其封装。
运行测试方法就可以得到一个新的表