此文件可参考hibernate工程

主键的生成方式:

1、identity 根据底层数据库的能力,来作为主键的自增长策略;适用于 mysql、db2、sqlserver等;不适用于oracle数据库; 2、uuid 主键为varchar类型; 生成16进制 32位的字符串类型;生成的数据唯一;适用于mysql、oracle、sqlserver、db2等数据库; 另外一种最方便的是:直接在数据库中对主键进行设置。 上面的就是讲过的生成方式,下面的一些拓展方式 3、assigned 所有的数据库都适用; 在调用save()方法之前,要对主键设置值,不设置报错; 4、increment 按照数据库的一个顺序值来增长;适用于mysql、oracle、db2、sqlserver、h2等数据库; 注意: 每次新增前,都会查询主键的最大值;然后在其基础上加1,作为新增的主键值; 5、sequence 根据底层数据库支持的能力,来作为主键值的生成策略;适用于oracle、db2数据库;不适用于mysql、sqlserver数据库; user5.seq_aa 6、native 根据底层数据库支持的自增长能力,自动选择hilo、identity、sequence其中的一个来完成该主键的自增长; mysql数据库中: oracle的数据库中 seq_aa

一对多和多对一

基于xml文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <!-- 维护与数据库中的关系 -->
  7. <class name="com.zhiyou100.entity.Book" table="T_book">
  8. <id name="id" column="id" type="int">
  9. <generator class="identity"></generator>
  10. </id>
  11. <!-- many-to-one:多对一 name:一方属性名 column:外键名 class: 一方的实体类 -->
  12. <property name="name" column="name" type="string"></property>
  13. <many-to-one name="student" column="sid"
  14. class="com.zhiyou100.entity.Student"/>
  15. </class>
  16. </hibernate-mapping>
  17. <hibernate-mapping>
  18. <!-- 维护与数据库中的关系 -->
  19. <class name="com.zhiyou100.entity.Student" table="T_student">
  20. <id name="id" column="id" type="int">
  21. <generator class="identity" />
  22. <!-- <generator class="increment" /> -->
  23. </id>
  24. <property name="name" column="name" type="string"></property>
  25. <property name="age" column="age" type="int"></property>
  26. <!-- 声明外键为sid -->
  27. <set name="books">
  28. <key column="sid"></key>
  29. <!-- one-to-many:多对一 class: 多方的实体类 -->
  30. <one-to-many class="com.zhiyou100.entity.Book"/>
  31. </set>
  32. </class>
  33. </hibernate-mapping>

测试类

  1. //one-to-many
  2. @Test
  3. public void testOne2Many() {
  4. Session session = openSession();
  5. Student student = (Student) session.get(Student.class,3);
  6. System.out.println(student);
  7. Set<Book> books = student.getBooks();
  8. for (Book book : books) {
  9. System.out.println(book);
  10. }
  11. session.close();
  12. }

懒加载

  1. //验证懒加载的原理 (get不进行懒加载,load进行懒加载)
  2. @Test
  3. public void testLazyload() {
  4. Session s = openSession();
  5. Student student = (Student) s.get(Student.class, 2);
  6. System.out.println("-----------------------------");
  7. System.out.println(student);
  8. s.close();
  9. }
  10. @Test
  11. public void testLazyload2() {
  12. Session s = openSession();
  13. Student student = (Student) s.load(Student.class, 2);
  14. System.out.println("-----------------------------");
  15. //你获取数据时它才运行SQL语句
  16. System.out.println(student);
  17. s.close();
  18. }