根据学习到的资料缕一缕
hibernate 5.x的sessionfactory创建:
变成了:
Configuration conf = new Configuration().configure("这里可以写cfg文件路径");
ServiceRegistry serviceRegistry = newStandardServiceRegistryBuilder().applySettings(conf.getProperties()).build();
SessionFactory factory = conf.buildSessionFactory();
//这里要注意的是最好使用getCurrentSession来获取Session,因为这样会在事务完结时关闭session。
Session sess = factory.getCurrentSession();
hibernate.cfg.xml
<!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节点代表一个数据库 -->
<session-factory>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="connection.username">scott</property>
<property name="connection.password">tiger</property>
<!-- 2. 其他相关配置 -->
<!-- 2.1 显示hibernate在运行时候执行的sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 2.2 格式化sql -->
<property name="hibernate.format_sql">true</property>
<!-- 2.3 自动建表
这里的create是指有没有表,每次都删掉了重新创建,一般的话是填update,
有的话就不创建,没有的话就新创建一个,如果实体类新增苏醒,那么会相应的
更新数据库的表结构,删除属性的话不会影响表字段
-->
<property name="hibernate.hbm2ddl.auto">create</property>
<!-- 具体为什么这样写现在不是很懂,但update需要加上这个才有效,
这时就需要加上这个属性,scott是指哪个数据库,由于是orcl所以写成用户名 -->
<property name="hibernate.default_schema">scott</property>
<!-- 3. 加载所有映射 -->
<mapping class="com.emiya.sshFreamWork.entity.Blog" />
<mapping class="com.emiya.sshFreamWork.entity.UsrEnty" />
</session-factory>
</hibernate-configuration>
xml文件映射
hibernate的映射关系大致分为以下三种:
1.一对一
2.一对多
3.多对多
附上cfg配置
<?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://localhost:3306/testhibernate</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hbm2ddl.auto">update</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!--
<property name="hibernate.hbm2ddl.auto">create</property>
-->
<mapping resource="entity\idCard.hbm.xml"/>
<mapping resource="entity\pepole.hbm.xml"/>
</session-factory>
</hibernate-configuration>
首先是一对一:
以人和身份证举例,一个人只能对应一张身份证,一张身份证对应一个人,下面以把关系交给Pepole类来维护为例
Pepole类:
package entity;
public class Pepole {
private int id;
private String name;
private IdCard card;//用于维护跟IdCard类的关系
public IdCard getCard() {
return card;
}
public void setCard(IdCard card) {
this.card = card;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
IdCard类:
public class IdCard {
private int id;
private String number;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
Pepole映射文件配置:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="entity.Pepole" table="t_pepole">
<id name="id">
<generator class="foreign">
<param name="property">card</param>
</generator>
</id>
<property name="name"></property>
<!--这里的constrained表示当前主键 参照指定属性的id IdCard是pepole的外键-->
<one-to-one name="card" constrained="true"></one-to-one>
</class>
</hibernate-mapping>
IdCard映射文件配置:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="entity.IdCard" table="t_idcard">
<id name="id">
<generator class="identity"></generator>
</id>
<property name="number"></property>
</class>
</hibernate-mapping>
注解映射:
注解映射只需要在实体类对应的属性的 get 方法上写上对应的注解,摆脱了成堆的 xml 文件,在 hibernate.cfg.xml 中的 mapping 节点中也只需要引入对应的实体类即可
例:
package com.emiya.sshFreamWork.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "blog", catalog = "")
public class Blog {
private int id; //微博id
private String content; //内容
private String publishtime; //发布时间
private int userid; //用户
@Id
@Column(name = "id",unique = true, nullable = false, length = 10)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name = "content", nullable = false, length = 1000)
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Column(name = "Publishtime", nullable = false, length = 6)
public String getPublishtime() {
return publishtime;
}
public void setPublishtime(String publishtime) {
this.publishtime = publishtime;
}
@Column(name = "Userid", nullable = false, length = 6)
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
}