Hibernate学习3—映射对象标识符(OID)
一、Hibernate 用对象标识符(OID)来区分对象
作如下代码的实验:
public class StudentTest { public static void main(String[] args) { SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); Session session = sessionFactory.openSession(); session.beginTransaction(); Student s1 = (Student) session.get(Student.class, 1L); Student s2 = (Student) session.get(Student.class, 2L); Student s3 = (Student) session.get(Student.class, 1L); System.out.println(s1==s2); //false System.out.println(s1==s3); //true 说明s1 和 s3指向的是同一个对象 session.getTransaction().commit(); session.close(); } }
console:
s1和s3指向的是session中同一个OID为1的Student对象;
二、Hibernate 对象标识符生成策略
生成主键的一个策略;
代理主键:stuId,纯编号,不具有任何业务意义;
比如你取的主键是学号,stuNo,也是唯一的,这是具有业务性的;
如果数据库建完之后,业务不会经常变动,比较稳的,比较死的,可以使用业务主键;
假如说业务经常变来变去的话,就使用代理主键,是不具有任何业务性的,仅仅是唯一的标识一条记录的;
我们增加Studen的代码都是:
public class StudentTest2 { public static void main(String[] args) { SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); Session session = sessionFactory.openSession(); session.beginTransaction(); Student s = new Student(); s.setName("张三"); session.save(s); session.getTransaction().commit(); session.close(); } }
1)increment
Student.hbm.xml:
<hibernate-mapping package="com.cy.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,发现建的表:
保存发出的sql:
2)identity
建的表:
保存发出的sql:
3)sequcence
mysql是不支持sequcence的,但是Oracle和DB2支持;
4)hilo
5)native
mysql的native和identity是一样的;
创建表和发出的sql步骤都和identity一样;不在演示