(三)映射对象标识符(OID)
2016-05-12 00:13
423 查看
所有项目导入对应的hibernate的jar包、mysql的jar包和添加每次都需要用到的HibernateUtil.java
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160511110726968-1488447065.jpg)
例子:
hibernate.cfg.xml
Student.java
Student.hbm.xml
StudentTest.java
这是数据库的信息:
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160511235427593-1147492777.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160511235434390-403702531.jpg)
结果显示:
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160511235242359-116703196.jpg)
这就表明S1和S3是指向一个地址的
业务主键VS 代理主键
代理主键是不具有业务性的;
1,increment 由Hibernate 自动以递增的方式生成标识符,适用代理主键;
2,identity 由底层数据库生成标识符;适用代理主键;
3,sequcence 由Hibernate 根据底层数据库的序列来生成标识符;适用代理主键;
4,hilo Hibernate 根据high/low 算法来生成标识符。适用代理主键
5,native 根据底层数据库对自动生成标识符的支持能力, 来选择identity,sequence 或hilo;适用代理主键;
increment 例子:
hibernate.cfg.xml
Student.java
Student.hbm.xml
StudentTest2.java
结果显示:
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512000113765-819946798.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512000119593-945846851.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512000128077-1205782826.jpg)
当我继续在执行一下代码。。。。。
结果显示:
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512000254609-1584137766.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512000258593-1460453627.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512000302874-1198564390.jpg)
identity 例子:
increment 例子的代码只改变一下Student.hbm.xml,其他什么代码都不改变。
Student.hbm.xml
结果显示:
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512000641859-491565788.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512000646702-312377282.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512000652687-1938668550.jpg)
当我继续在执行一下代码。。。。。
结果显示:
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512000756937-573906834.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512000801124-1483334591.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512000804546-1641718870.jpg)
native 例子:
increment 例子的代码只改变一下Student.hbm.xml,其他什么代码都不改变。
Student.hbm.xml
结果显示:
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512001047780-2143467883.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512001052296-1451393624.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512001055999-622581914.jpg)
当我继续在执行一下代码。。。。。
结果显示:
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512001204609-245777550.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512001208530-1568862849.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512001211780-1199515461.jpg)
主要native用的最多。
第一节:Hibernate 用对象标识符(OID)来区分对象
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160511110726968-1488447065.jpg)
例子:
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://localhost:3306/hibernate</property> <property name="connection.username">root</property> <property name="connection.password">123456</property> <!-- 方言 --> <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> <!-- 控制台显示SQL --> <property name="show_sql">true</property> <!-- 自动更新表结构 --> <property name="hbm2ddl.auto">update</property> <mapping resource="com/wishwzp/model/Student.hbm.xml"/> </session-factory> </hibernate-configuration>
Student.java
package com.wishwzp.model; public class Student { private long id; private String name; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + "]"; } }
Student.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.wishwzp.model"> <class name="Student" table="t_student"> <id name="id" column="stuId"> <generator class="native"></generator> </id> <property name="name"></property> </class> </hibernate-mapping>
StudentTest.java
package com.wishwzp.service; import org.hibernate.Session; import org.hibernate.SessionFactory; import com.wishwzp.model.Student; import com.wishwzp.util.HibernateUtil; public class StudentTest { public static void main(String[] args) { SessionFactory sessionFactory=HibernateUtil.getSessionFactory(); Session session=sessionFactory.openSession(); // 生成一个session session.beginTransaction(); // 开启事务 //获取主键为1的学生 Student s1=(Student)session.get(Student.class, Long.valueOf(1));//当执行到这里的时候Session缓冲中会有OID为1的Studnet对象 //获取主键为2的学生 Student s2=(Student)session.get(Student.class, Long.valueOf(2));//当执行到这里的时候Session缓冲中会有OID为2的Studnet对象 //获取主键为1的学生 Student s3=(Student)session.get(Student.class, Long.valueOf(1));//在Session缓冲中找到了UID为1,所以指向了UID为1的对象 System.out.println(s1==s2);//false System.out.println(s1==s3);//true session.getTransaction().commit(); // 提交事务 session.close(); // 关闭session } }
这是数据库的信息:
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160511235427593-1147492777.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160511235434390-403702531.jpg)
结果显示:
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160511235242359-116703196.jpg)
这就表明S1和S3是指向一个地址的
第二节:Hibernate 对象标识符生成策略
主键的分类业务主键VS 代理主键
代理主键是不具有业务性的;
1,increment 由Hibernate 自动以递增的方式生成标识符,适用代理主键;
2,identity 由底层数据库生成标识符;适用代理主键;
3,sequcence 由Hibernate 根据底层数据库的序列来生成标识符;适用代理主键;
4,hilo Hibernate 根据high/low 算法来生成标识符。适用代理主键
5,native 根据底层数据库对自动生成标识符的支持能力, 来选择identity,sequence 或hilo;适用代理主键;
increment 例子:
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://localhost:3306/hibernate</property> <property name="connection.username">root</property> <property name="connection.password">123456</property> <!-- 方言 --> <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> <!-- 控制台显示SQL --> <property name="show_sql">true</property> <!-- 自动更新表结构 --> <property name="hbm2ddl.auto">update</property> <mapping resource="com/wishwzp/model/Student.hbm.xml"/> </session-factory> </hibernate-configuration>
Student.java
package com.wishwzp.model; public class Student { private long id; private String name; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + "]"; } }
Student.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.wishwzp.model"> <class name="Student" table="t_student"> <id name="id" column="stuId"> <generator class="increment"></generator> </id> <property name="name"></property> </class> </hibernate-mapping>
StudentTest2.java
package com.wishwzp.service; import org.hibernate.Session; import org.hibernate.SessionFactory; import com.wishwzp.model.Student; import com.wishwzp.util.HibernateUtil; public class StudentTest2 { public static void main(String[] args) { SessionFactory sessionFactory=HibernateUtil.getSessionFactory(); Session session=sessionFactory.openSession(); // 生成一个session session.beginTransaction(); // 开启事务 Student s=new Student(); s.setName("张三"); session.save(s); session.getTransaction().commit(); // 提交事务 session.close(); // 关闭session } }
结果显示:
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512000113765-819946798.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512000119593-945846851.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512000128077-1205782826.jpg)
当我继续在执行一下代码。。。。。
结果显示:
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512000254609-1584137766.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512000258593-1460453627.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512000302874-1198564390.jpg)
identity 例子:
increment 例子的代码只改变一下Student.hbm.xml,其他什么代码都不改变。
Student.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.wishwzp.model"> <class name="Student" table="t_student"> <id name="id" column="stuId"> <generator class="identity"></generator> </id> <property name="name"></property> </class> </hibernate-mapping>
结果显示:
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512000641859-491565788.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512000646702-312377282.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512000652687-1938668550.jpg)
当我继续在执行一下代码。。。。。
结果显示:
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512000756937-573906834.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512000801124-1483334591.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512000804546-1641718870.jpg)
native 例子:
increment 例子的代码只改变一下Student.hbm.xml,其他什么代码都不改变。
Student.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.wishwzp.model"> <class name="Student" table="t_student"> <id name="id" column="stuId"> <generator class="native"></generator> </id> <property name="name"></property> </class> </hibernate-mapping>
结果显示:
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512001047780-2143467883.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512001052296-1451393624.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512001055999-622581914.jpg)
当我继续在执行一下代码。。。。。
结果显示:
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512001204609-245777550.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512001208530-1568862849.jpg)
![](https://images2015.cnblogs.com/blog/812323/201605/812323-20160512001211780-1199515461.jpg)
主要native用的最多。
相关文章推荐
- 小酌重构系列[10]——分离职责
- 里氏替换原则(Liskov Substitution Principle) LSP
- 小酌重构系列[10]——分离职责
- [Java] 基础命令
- Centos 7 学习之静态IP设置
- netfilter/iptables全攻略
- Install Sentry Server(Sentry Server的搭建)[for_wind]
- C 标准库 —— stdio.h
- CentOS7 下linux不能上网解决方法,centos7 eth0 没有ip,IP突然丢失
- nefu阶乘定理
- C/C++中结构体与类的区别
- 一个例子深入理解ClassLoader
- CocoaPods相关知识点
- dede taglist模板中调用自定义字段
- 关于mockito的一些文章
- Leetcode Everyday: 100. Same Tree
- Block
- 测试计划
- Mac Android 源码下载 编译 运行 Android6.0.1
- CVG Talk - Saliency based detection