hibernate的cfg.xml详解
1.以下为hibernatecfg.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.microsoft.sqlserver.jdbc.SQLServerDriver</property>
<property name="connection.url">jdbc:sqlserver://127.0.0.1:1433;DatabaseName=hibernat_test</property>
<property name="connection.username">sa</property>
<property name="connection.password">wjn</property>
<property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
<property name="show_sql">true</property> <!-- 是否把sql输出到控制台 -->
<property name="format_sql">true</property><!-- sql输出到控制台是否进行排版 -->
<property name="hbm2ddl.auto">create</property>
<mapping resource="Students.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>
hbm2ddl.auto的4个参数
validate 加载hibernate时,验证创建数据库表结构
create 每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。
create-drop 加载hibernate时创建,退出是删除表结构
update 加载hibernate自动更新数据库结构
dialect
数据库方言:相关链接http://blog.csdn.net/han_dongwei/article/details/7281728
hibernate.default.schema
指定默认的数据库名,在每一个表名前面加上数据库名。
2.关系映射配置文件和实体类
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-9-15 18:12:16 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="hibernate_test.Students" table="STUDENTS">
<id name="sid" type="int">
<column name="SID" />
<generator class="assigned" /> <!--主键生成策略下面有介绍-->
</id>
<property name="sname" type="java.lang.String">
<column name="SNAME" />
</property>
<property name="gender" type="java.lang.String">
<column name="GENDER" />
</property>
<property name="birthday" type="java.lang.String">
<column name="BIRTHDAY" />
</property>
<property name="address" type="java.lang.String">
<column name="ADDRESS" />
</property>
</class>
</hibernate-mapping>
实体类
package hibernate_test;
public class Students {
private int sid;
private String sname;
private String gender;
private String birthday;
private String address;
public Students(){
}
public Students(int sid, String sname, String gender, String birthday, String address) {
super();
this.sid = sid;
this.sname = sname;
this.gender = gender;
this.birthday = birthday;
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 String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Students [sid=" + sid + ", sname=" + sname + ", gender=" + gender + ", birthday=" + birthday
+ ", address=" + address + "]";
}
}
测试类
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import hibernate_test.Students;
public class Students_test {
private SessionFactory factory;//会话工厂对象
private Session session;
private Transaction transaction;//事务对象
@Before
public void init(){
//创建配置对象
Configuration configiguration = new Configuration().configure();
// 创建服务注册对象
ServiceRegistryBuilder builder = new ServiceRegistryBuilder().applySettings(configiguration.getProperties());
ServiceRegistry registry = builder.buildServiceRegistry();
factory = configiguration.buildSessionFactory(registry);
// 会话对象
session = factory.openSession();
// 开启事务
transaction = session.beginTransaction();
}
@After
public void destory(){
transaction.commit();/*提交事务*/
session.close();/*关闭会话*/
factory.close();/*关闭会话工厂*/
}
@Test
public void testsavestudents(){
Students st=new Students(1,"张三丰","男","1995-07-1","武当山");
session.save(st);
}
}
3.hibernate执行流程
session
session与jdbc的connection是多对一关系。
它的几种方法:
update();
save();
delete();
createQuery();
transaction
hibernate对数据的操作都是封装在事务中的,并且默认是不自动提交的,所以在session保存数据时必须要开启事务
否则不会真的保存到数据中的。
通过设置自动提交来达到事务的自动提交:
dowork(new work(){
public void execute(Connection connection)throws SQLException{
connection.setAutoCommit(true);//设置自动提交
}
});
4.hbm配置文档各属性归纳
主键生成策略
1.increment
可以生成long、int、short类型的主键,由hibernate在内存中生成主键,每次增量为1,不依赖于底层数据库,但是因为是由hibernate生成的,所以只能有一个hibernate进程访问数据库,否则就会产生主键冲突,所以不能在集群的情况下使用;
2.identity
可以生成long、int、short类型的主键,是由数据库自己生成的,这个主键必须设置为自增长,因此使用identity的前提是数据库支持自增长,Oracle是不支持的;
3.sequence
采用数据库提供的sequence机制生成主键,需要数据库支持sequence,MySQL是不支持的;
4.hilo
使用一个高低位算法生成的long、short、int类型的标识符,跨数据库;
5.native
根据底层数据库的能力选择identity、sequence或hilo中的一个,当项目中用到多个数据库时可以使用这种方式,使用时需要设置表的自增字段或建立序列,建立表等;
6.uuid
hibernate采用128位的uuid算法来生成主键,能够在网络环境中生成唯一的一个32位16进制数字的字符串,跨数据库,不用访问数据库就能生成主键,所以效率高且能保证唯一性,移植非常方便;
7.assigned
与hibernate和底层数据库均无关,人为控制主键的生成,应尽量避免;
8.foreign
使用另外一个相关联的对象的标识符,大多用在一对一关系中;
代理主键:与业务无关且能唯一标识数据库中记录,一般由数据库自动生成,除assigned之外的所有主键生成策略;
自然主键:与业务相关,由用户指定,且能唯一标识数据库中的任意一条记录,如assigned;
5.hibernate与java和sql数据类型之间的关系
往数据库中存取图片以及视频
参见如下
http://blog.csdn.net/duchao123duchao/article/details/46896427