Java Hibernate 5.3.x
SchemeExport
Hibernate根据实体类和实体类映射文件自动生成表结构。
示例代码:
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="connection.url">jdbc:mysql://172.16.65.200:3306/hibernate?useUnicode=true&characterEncoding=UTF8</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.username">root</property> <property name="connection.password">123456</property> <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> <property name="hbm2ddl.auto">create</property> <property name="show_sql">true</property> <property name="format_sql">true</property> <property name="hibernate.current_session_context_class">thread</property> <mapping class="com.entity.Students" /> </session-factory> </hibernate-configuration>
package com.entity; import javax.persistence.Entity; //JPA注解 import javax.persistence.Id; import java.util.Date; @Entity public class Students { private int sid; // 学号 private String name; // 姓名 private String gender; // 性别 private Date birthday; // 出生日期 private String major; // 专业 private String address; // 地址 public Students(){ } @Id public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } public String getName() { return name; } public void setName(String name) { this.name = name; } 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; } @Override public String toString() { return "Students{" + "sid=" + sid + ", name='" + name + '\'' + ", gender='" + gender + '\'' + ", birthday=" + birthday + ", major='" + major + '\'' + ", address='" + address + '\'' + '}'; } }
package com.entity; import org.hibernate.boot.Metadata; import org.hibernate.boot.MetadataSources; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.tool.hbm2ddl.SchemaExport; import org.hibernate.tool.schema.TargetType; import org.junit.jupiter.api.Test; import java.util.EnumSet; public class TestStudents { @Test public void testSchemaExport(){ // 创建服务注册对象 StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build(); // 生成Metadata Metadata metadata = new MetadataSources(serviceRegistry).buildMetadata(); // 生成表结构 SchemaExport schemaExport = new SchemaExport(); schemaExport.create(EnumSet.of(TargetType.DATABASE), metadata); } }
Session
openSession
每次打开一个新的Session会话
getCurrentSession
始终是一个Session会话,类似工厂方法
需要在hibernate.cfg.xml文件中添加配置:<property name="hibernate.current_session_context_class">thread</property>
主键自增
1、在主键配置中增加native
<id name="sid" column="sid">
<generator class="native"/>
</id>
2、通过Annotation方式
@GeneratedValue(strategy = GenerationType.IDENTITY) // 表示将主键设置为auto_increment
3、JPA提供的四种标准用法为TABLE、SEQUENCE、IDENTITY、AUTO
TABLE:使用一个特定的数据库表格来保存主键。
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
IDENTITY:主键由数据库自动生成(主要是自动增长型)。
AUTO:主键由程序控制,在指定主键时,如果不指定主键生成策略,默认为AUTO。
Column注解
@Entity 实体类,映射为一个表。
@Column 可将属性映射到列,使用该注解来覆盖默认值。
常用属性:
name: 可选,表示数据库表中该字段的名称,默认和属性名称一致。
nullable: 可选,一波啊是该字段是否允许为null,默认为true。
unique: 可选,表示该字段是否是唯一标识,默认为false。
length: 可选,表示该字段大小,仅对String类型的字段有效。
@ManyToOne 多对一映射
@OneToMany 一对多映射
@ManyToMany 多对多映射
Fetch和CasCade
FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载
FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载
CascadeType.REFRESH:级联刷新,当多个用户同时作操作一个实体,为了用户取到的数据是实时的,在用实体中的数据之前就可以调用一下refresh()方法!
CascadeType.REMOVE:级联删除,当调用remove()方法删除Order实体时会先级联删除OrderItem的相关数据!
CascadeType.MERGE:级联更新,当调用了Merge()方法,如果Order中的数据改变了会相应的更新OrderItem中的数据,
CascadeType.PERSIST:级联保存,当调用了Persist() 方法,会级联保存相应的数据,
CascadeType.ALL:包含以上所有级联属性。
http://docs.jboss.org/hibernate/orm/5.3/userguide/html_single/Hibernate_User_Guide.html