Hibernate的注解类别可以分为
类级别的注解
属性级别的注解
关联映射的注解
首先介绍类级别的注解
@Entity(映射实体类注解)
@Entity(name = "数据库中的表的名称")
name: 可选, 对应数据库中的一张表, 若表名和实体类名相同, 则可以省略.
在使用@Entity时需要指定主键属性
例子:
配置文件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"> <hibernate-configuration> <session-factory> <!--配置数据库连接 --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://192.168.5.134:3306/hibernate_mysql</property> <property name="connection.username">root</property> <property name="connection.password">root</property> <!--配置方言 --> <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> <!--是否展示sql语句 --> <property name="show_sql">true</property> <!--格式化sql --> <property name="format_sql">true</property> <!--建表策略 --> <property name="hbm2ddl.auto">update</property> <!--如果使用的是本地事务(jdbc事务 本地事务:数据库只有一个) --> <property name="hibernate.current_session_context_class">thread</property> <!--如果使用的是全局事务(jta事务 全局事务:数据库有多个) --> <!--<property name="hibernate.current_session_context_class">jta</property>--> <!--创建的实体类对应的表 --> <!--<mapping class="com.idea.hibernate.oto_bfk.Students05"/>--> <!--<mapping class="com.idea.hibernate.oto_bfk.IdCard02"/>--> <mapping class="com.idea.hibernate.mto_fk.Students06"/> <mapping class="com.idea.hibernate.mto_fk.ClassRoom"/> </session-factory> </hibernate-configuration>
实体类Students
@Entity(name = "Students") //映射成关系型数据库中的一张表
//javax.persistence.Entity ==> jpa注解
public class Students {
@Id //设置为主键
@GeneratedValue(strategy = GenerationType.AUTO) //主键自增
private int sid; //学号
private String sname; //姓名
private String gender; //性别
private Date birthday; //出生日期
private String major; //专业
private String address; //地址
public Students() {
}
public Students(int sid, String sname, String gender, Date birthday, String major, String address) {
this.sid = sid;
this.sname = sname;
this.gender = gender;
this.birthday = birthday;
this.major = major;
this.address = address;
}
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;
}
}
测试
@Test
public void testSchemaExport(){
//创建hibernate配置对象
Configuration configuration = new Configuration().configure();
//创建服务注册对象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
//生成SssionFactory
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
//生成SchemaExport对象
SchemaExport schemaExport = new SchemaExport(configuration);
schemaExport.create(true, true);
}
控制台输出
数据库结果
@Table(标注表的注解)
@Table(name = "", catalog = "", schema = "")
一般和@Entity注解配合使用, 也是用在类上
name: 可选, 映射表的名称, 默认表名和实体名称一样, 只有在不一致的情况下才需要指定表名
catalog: 可选, 表示catalog目录名称, 默认为空
schema: 可选, 表示schema模式名称, 默认为空
schema和catalog的区别: 一个数据库系统由多个catalog组成, 一个catalog由多个schema组成(mysql和oracle不支持catalog属性), mysql的schema的值默认是数据库的名称, oracle默认是用户的id
@Entity
@Table(name = "t_students", schema = "hibernate_mysql")
//javax.persistence.Entity ==> jpa注解
public class Students {...}
控制台输出
数据库结果
@ Embeddable(标注嵌入类的注解)
表示一个非Entity类可以嵌入到另一个Entity类中作为一个属性而存在
由于不是一个Entity类, 所以其所标注的类不会映射成一张表
新建一个Address的非Entity类, 标上@Embeddable注解
//地址类
@Embeddable //表示这是一个非Entity的嵌入类, 该类在另一个实体类中充当属性
public class Address {
private String postCode; //邮编
private String address; //地址
private String phone; //联系电话
public Address() {
}
public Address(String postCode, String address, String phone) {
this.postCode = postCode;
this.address = address;
this.phone = 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;
}
}
数据库结果