hibernate详解1

                                                 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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醒悟wjn

打赏可获取源码

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值