使用hibernate利用实体类生成表和利用表生成实体类
1,配置数据库,这里以oracle数据库为例。点击右侧Database图标:
展开后选择oracle
将SID下拉框打开选择Service Name,之后按自己的数据库信息填写就可以了
可以点击Schemas选择连接的数据库,一般情况下我们就选择当前连接的数据库就好了(Current Schema),配置完成展开就可以看到当前数据库
2,根据数据库中的表在我们的项目中生成实体类。在Tool Windows中点击Persistance,打开持久化窗口,右键持久化窗口中的项目名称:
右键项目
点击从数据库中生成映射,显示
点击某个表,选择包,点击OK就可以生成实体类了。然后再将生成的实体类写到hibernate的配置文件中,写在配置的sessionFactory的bean的标签内。这里有两种方式:
第一种,逐个类添加:
1 <!-- 扫描单个class--> 2 <property name="annotatedClasses"> 3 <list> 4 <value>com.example.pojo.Message</value> 5 </list>
第二种,直接扫描整个包,将包下所有的实体类都配置进去:
1 <!--扫描整个package,加载整个包下的class--> 2 <property name="packagesToScan"> 3 <list> 4 <value>com.example.pojo</value> 5 </list> 6 </property>
配置完之后,我们就可以利用hibernate的session工厂生成的session对这个表进行操作了:
1 public Message findMessageById(String id) { 2 //实例化Configuration,这行代码默认加载hibernate.cfg.xml文件 3 //String hql = "FROM Message where id = ?"; 4 String hql = "FROM Message where id = ?"; 5 Query query = getSession().createQuery(hql).setString(0,id); 6 Message message = (Message) query.uniqueResult(); 7 return message; 8 }
2,利用写好的实体类和xx.hbm.xml文件生成数据库表,我们正常定义一个model:
1 package com.example.pojo; 2 3 import org.hibernate.annotations.Entity; 4 5 @Entity 6 public class Book { 7 private Integer id; 8 private String bookName; 9 private String isbn; 10 private int price; 11 private int stock; 12 13 public Book(Integer id,String bookName,String isbn,int price,int stock){ 14 super(); 15 this.id = id; 16 this.bookName = bookName; 17 this.isbn = isbn; 18 this.price = price; 19 this.stock = stock; 20 } 21 22 public Book() { 23 } 24 25 public Integer getId() { 26 return id; 27 } 28 29 public void setId(Integer id) { 30 this.id = id; 31 } 32 33 public String getBookName() { 34 return bookName; 35 } 36 37 public void setBookName(String bookName) { 38 this.bookName = bookName; 39 } 40 41 public String getIsbn() { 42 return isbn; 43 } 44 45 public void setIsbn(String isbn) { 46 this.isbn = isbn; 47 } 48 49 public int getPrice() { 50 return price; 51 } 52 53 public void setPrice(int price) { 54 this.price = price; 55 } 56 57 public int getStock() { 58 return stock; 59 } 60 61 public void setStock(int stock) { 62 this.stock = stock; 63 } 64 }
然后添加一个book.hmb.xml,相当于映射文件,用于hibernate读取生成数据库表的以及对应字段与属性直接的关联:
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 <!-- Generated 2016-3-15 16:30:05 by Hibernate Tools 3.4.0.CR1 --> 5 <hibernate-mapping> 6 <class name="com.example.pojo.Book" table="BOOK"> 7 <id name="id" type="java.lang.Integer"> 8 <column name="ID" /> 9 <generator class="native" /> 10 </id> 11 <property name="bookName" type="java.lang.String"> 12 <column name="BOOK_NAME" /> 13 </property> 14 <property name="isbn" type="java.lang.String"> 15 <column name="ISBN" /> 16 </property> 17 <property name="price" type="int"> 18 <column name="PRICE" /> 19 </property> 20 <property name="stock" type="int"> 21 <column name="STOCK" /> 22 </property> 23 </class> 24 </hibernate-mapping>
然后将映射文件配置到hibernate配置文件的sessionFactory中:
1 <property name="mappingResources"> 2 <array> 3 <value>com/example/dao/orm/Book.hbm.xml</value> 4 </array> 5 </property>
重启程序就会生成名为Book的表了,这里要注意一下的就是我们在hibernate配置文件中配置的数据库属性<property name="hbm2ddl.auto">update</property>
我的配置如下:
create:启动hibernate时,自动删除原来的表,新建所有的表,所以每次启动后的以前数据都会丢失。update:表示自动根据model对象来更新表结构,启动hibernate时会自动检查数据库,如果缺少表,则自动建表;如果表里缺少列,则自动添加列。
none:不会对数据库进行任何操作。
所以我们一般要对数据库有操作时,就选择update,如果不需要生成表或者表数据不需要改动的情况下,我们就配置none,特定开发情况下用create。
数