1、Hibernate注解简介
使用注解的目的:为了简化繁琐的ORM映射文件(*.hbm)的配置
2、JPA与Hibernate的关系
什么是JPA?
全称Java Persistence API
JPA注解是JAVAEE的规范和标准
JPA与Hibernate的关系:JPA是标准接口,Hibernate是实现,但是其功能是JPA的超集。
Hibernate如何实现与JPA的关系?
通过hibernate-annotation、hibernate-entitymannager和hibernate-core三个组件来实现。
一般在实际开发中,优先考虑使用JPA注解,这样更有利于程序的移植和扩展。
3、Hibernate注解分类
1、类级别的注解
@Entity 、@Table、@Embeddable
2、属性级别的注解
3、映射关系注解
4、@Entity
@Entity:映射实体类
@Entity(name="tableName")
name:可选,对应数据库中的一个表。若表名与实体类名相同,则可以省略。
注意:使用@Entity时必须指定实体类的主键属性。
如:
@Entity
public class Students {
private int sid; //学号
private String sname;//姓名
private String gender;//性别
private String major;//专业
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 String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
public Students() {
super();
}
public Students(int sid, String sname, String gender, String major) {
this.sid = sid;
this.sname = sname;
this.gender = gender;
this.major = major;
}
@Override
public String toString() {
return "Students [sid=" + sid + ", sname=" + sname + ", gender=" + gender + ", major=" + major + "]";
}
}
最后测试出现如下错误:
为解决这个问题我们在students类中的getId上添加@Id表示是主键再进行测试,测试通过
5、@Table
@Table(name="",catalog="",schema="")
@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息。
name:可选,映射表的名称,默认表名和实体名称一致,只有在不一致的情况下才需要表名。
catalog :可选,表示Catalog(目录)名称,默认为Catalog("")。
schema:可选,表示Schema(模式)名称,默认为Schema("")。
6、@Embeddable
@Embeddable表示一个非Entity类可以嵌入到另一个Entity类中作为属性而存在。如:
package com.txr.entity;
import javax.persistence.Embeddable;
//地址类
@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;
}
public Address(String postCode, String address, String phone) {
this.postCode = postCode;
this.address = address;
this.phone = phone;
}
public Address() {
super();
}
@Override
public String toString() {
return "Address [postCode=" + postCode + ", address=" + address + ", phone=" + phone + "]";
}
}
package com.txr.entity;
import javax.persistence.Entity;//JPA注解
import javax.persistence.Id;
import javax.persistence.Table;
//学生实体类
@Entity
@Table(name="t_students",schema="hibernate")
public class Students {
private int sid; //学号
private String sname;//姓名
private String gender;//性别
private String major;//专业
private Address address;//地址
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
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 String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
public Students() {
super();
}
public Students(int sid, String sname, String gender, String major,Address add) {
this.sid = sid;
this.sname = sname;
this.gender = gender;
this.major = major;
this.address=add;
}
@Override
public String toString() {
return "Students [sid=" + sid + ", sname=" + sname + ", gender=" + gender + ", major=" + major + "]";
}
}
运行后生成的表结构
7、schema与catalog
从实现的角度来看,各种数据库系统对Catalog和Schema的支持和实现方式千差万别。