注解的方式与xml很很多类似:
首先是需要加入4个jar包:hibernate-commons-annotations.jar 、 hibernate-annotations.jar、ejb3-persistence.jar 、 hibernate-jpa-2.0-api-1.0.1.Final.jar
下面是不同的地方:
(1):hibernate.hbm.xml 文件中把引用:xxx.hbm.xml改为引用实体类:
即把:<mapping resource="com/wsw/hibernate/model/Person.hbm.xml"/>
改为:<mapping class="com.wsw.hibernate.model.Teacher" />
(2):获取SessionFactory方式发生了变化:
即:由SessionFactory sf = new Configuration().configure().buildSessionFactory()
改为:SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory()
注意:在hibernate4之后就移除了AnnotationConfiguration()方法了,Configuration已经包含了注解的方法,所以你可以直接用:
Configuration con = new Configuration(); SessionFactory sf = con.configure().buildSessionFactory(); Session s = sf.openSession();
如果是hibernate4之前的版本还是要用AnnotationConfiguration()方法
(3):注解方式不需要在xxx.hbm.xml把实体类与表进行映射。而采用在实体类中进行注解。
注意:(1):如果实体类属性名与表字段名不一致的时候,要么都注解在属性前,要么都注解在get方法前。不能部分注解在属性前,部分注解在方法前。
(2):如果实体类属性名与表字段名一致的时候,可以部分注解在属性前,部分注解在方法前。
(3):如果在实体类中某些属性不注解:(属性和get都不写注解),默认为表字段名与实体类属性名一致。
(4):如果实体类的某个成员属性不需要存入数据库中,使用@Transient 进行注解就可以了。即类似于:(xxx.hbm.Xml配置中的某些字段不写(就是不需要对这个成员属性进行映射))
(5):表名称可以在实体类前进行注解。
(6):所有这些注解在:javax.persistence包下。而不是在hibernate包中。
代码:
hibernate.cfg.xml配置:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <session-factory> 7 <!-- 第一部分:配置数据库信息 --> 8 <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 9 <property name="hibernate.connection.url">jdbc:mysql:///hibernate_day04</property> 10 <property name="hibernate.connection.username">root</property> 11 <property name="hibernate.connection.password">343492</property> 12 <!-- 第二部分:配置hibernate信息 可选的--> 13 <!--配置session绑定本地线程 --> 14 <property name="hibernate.current_session_context_class">thread</property> 15 16 17 <!--输出底层sql语句 --> 18 <property name="hibernate.show_sql">true</property> 19 <property name="hibernate.format_sql">true</property> 20 <!--hibernate帮创建表,需要配置后 21 update:如果已经有表,更新,如果没有,创建 22 --> 23 <property name="hibernate.hbm2ddl.auto">update</property> 24 <!-- 配置数据库的方言 --> 25 <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 26 27 28 29 <!-- 第三部分:把注解实体类放到核心配置文件中 --> 30 <mapping class="cn.itcast.entity.Customer"/> 31 <mapping class="cn.itcast.entity.LinkMan"/> 32 </session-factory> 33 </hibernate-configuration>
实体类Customer:
1 package cn.itcast.entity; 2 3 import java.util.HashSet; 4 import java.util.Set; 5 6 import javax.persistence.Column; 7 import javax.persistence.Entity; 8 import javax.persistence.GeneratedValue; 9 import javax.persistence.GenerationType; 10 import javax.persistence.Id; 11 import javax.persistence.Table; 12 13 import org.hibernate.annotations.GenericGenerator; 14 15 16 17 @Entity 18 @Table(name="t_customer") 19 public class Customer{ 20 private Integer cid; 21 private String custName; 22 private String custLevel; 23 private String custSource; 24 private String custPhone; 25 private String custMobile; 26 27 @Id 28 @GenericGenerator(name = "generator", strategy = "increment") 29 @GeneratedValue(generator = "generator") 30 31 @Column(name = "Cid") 32 public Integer getCid() { 33 return cid; 34 } 35 36 public void setCid(Integer cid) { 37 this.cid = cid; 38 } 39 40 @Column(name = "custName") 41 public String getCustName() { 42 return custName; 43 } 44 45 public void setCustName(String custName) { 46 this.custName = custName; 47 } 48 49 @Column(name = "custLevel") 50 public String getCustLevel() { 51 return custLevel; 52 } 53 54 public void setCustLevel(String custLevel) { 55 this.custLevel = custLevel; 56 } 57 58 @Column(name = "custSource") 59 public String getCustSource() { 60 return custSource; 61 } 62 63 public void setCustSource(String custSource) { 64 this.custSource = custSource; 65 } 66 67 @Column(name = "custPhone") 68 public String getCustPhone() { 69 return custPhone; 70 } 71 72 public void setCustPhone(String custPhone) { 73 this.custPhone = custPhone; 74 } 75 76 @Column(name = "custMobile") 77 public String getCustMobile() { 78 return custMobile; 79 } 80 81 public void setCustMobile(String custMobile) { 82 this.custMobile = custMobile; 83 } 84 85 }
实体类LinkMan:
1 package cn.itcast.entity; 2 3 import javax.persistence.Entity; 4 import javax.persistence.GeneratedValue; 5 import javax.persistence.GenerationType; 6 import javax.persistence.Id; 7 import javax.persistence.Table; 8 9 import org.hibernate.annotations.GenericGenerator; 10 11 12 @Entity 13 @Table(name="t_linkman") 14 public class LinkMan { 15 private Integer lkm_id; 16 private String lkm_name; 17 private String lkm_gender; 18 private String lkm_phone; 19 20 21 22 23 24 @Id 25 @GenericGenerator(name = "generator", strategy = "increment") 26 @GeneratedValue(generator = "generator") 27 public Integer getLkm_id() { 28 return lkm_id; 29 } 30 public void setLkm_id(Integer lkm_id) { 31 this.lkm_id = lkm_id; 32 } 33 public String getLkm_name() { 34 return lkm_name; 35 } 36 public void setLkm_name(String lkm_name) { 37 this.lkm_name = lkm_name; 38 } 39 public String getLkm_gender() { 40 return lkm_gender; 41 } 42 public void setLkm_gender(String lkm_gender) { 43 this.lkm_gender = lkm_gender; 44 } 45 public String getLkm_phone() { 46 return lkm_phone; 47 } 48 public void setLkm_phone(String lkm_phone) { 49 this.lkm_phone = lkm_phone; 50 } 51 52 53 54 55 56 }
工具类HibernateUtils:
1 package cn.itcast.utils; 2 3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 import org.hibernate.Transaction; 6 import org.hibernate.cfg.Configuration; 7 8 public class HibernateUtils { 9 private final static Configuration cfg; 10 private final static SessionFactory sessionFactory; 11 //静态的代码块 12 static { 13 // 第一步 加载hibernate核心配置文件 14 //在hibernate里面封装了对象 15 cfg = new Configuration(); 16 cfg.configure(); 17 18 19 // 第二步创建 Sessionfactory对象 20 //读取hibernate核心配置文件内容,创建ssssionFactory 21 //在过程中,根据映射关系,在配置数据库里面把表创建了 22 sessionFactory = cfg.buildSessionFactory(); 23 } 24 25 //提供返回与本地线程绑定的session的方法 26 public static Session getSession(){ 27 return sessionFactory.getCurrentSession(); 28 } 29 30 31 32 public static SessionFactory getSessionFactory(){ 33 return sessionFactory; 34 } 35 36 public static void main(String[] args){ 37 38 } 39 }
测试类test:
1 package cn.itcast.hibernatetest; 2 3 import java.util.HashSet; 4 import java.util.List; 5 import java.util.Set; 6 7 import org.hibernate.Criteria; 8 import org.hibernate.Query; 9 import org.hibernate.SQLQuery; 10 import org.hibernate.Session; 11 import org.hibernate.SessionFactory; 12 import org.hibernate.Transaction; 13 import org.hibernate.criterion.DetachedCriteria; 14 import org.hibernate.criterion.Order; 15 import org.hibernate.criterion.Projections; 16 import org.hibernate.criterion.Restrictions; 17 import org.junit.Test; 18 19 import cn.itcast.entity.Customer; 20 import cn.itcast.entity.LinkMan; 21 import cn.itcast.utils.HibernateUtils; 22 23 public class test { 24 //存储数据 25 @Test 26 public void test(){ 27 SessionFactory sessionFactory=HibernateUtils.getSessionFactory(); 28 Session session=sessionFactory.openSession(); 29 Transaction tx=session.beginTransaction(); 30 31 Customer customer=new Customer(); 32 customer.setCustLevel("1"); 33 customer.setCustMobile("3435692"); 34 customer.setCustName("阿里巴巴"); 35 customer.setCustPhone("18863897308"); 36 customer.setCustSource("北京海淀"); 37 38 session.save(customer); 39 tx.commit(); 40 session.close(); 41 sessionFactory.close(); 42 } 43 44 }
Hibernate中的常用注解:
1,@Entity : 表示当前的类为实体类,声明在类的前面。可以将当前类和数据库的表和字段进行关联映射。
2,@Table:表示映射的表,声明在类的前面
3,@Id:表示主键的映射,声明在主键的get方法前边,默认情况下主键利用assigned(用户提供)生成策略。如果想要设置API规范提供了四种主键生成策略:
@GeneratedValue(strategy=GenerationType.AUTO) 相当于Hibernate框架的native主键生成策略
@GeneratedValue(strategy=GenerationType.IDENTITY) 相当于Hibernate框架的identity主键生成策略,适用于MySQL,SQL Server
@GeneratedValue(strategy=GenerationType.SEQUENCE) 相当于Hibernate框架的sequence主键生成策略,适用于Oracle,DB2
@GeneratedValue(strategy=GenerationType.TABLE) 使用一张单表管理主键值。
默认情况下API规范是不支持Hibernate框架中的uuid的主键生成策略,假如我们想要使用,需要我们进行增加主键生成器,如下:
@GenericGenerator(name="hibernate-uuid",strategy="uuid")
@GeneratedValue(generator="hibernate-uuid")
4,@Column : 表示映射属性,和表的字段进行关联
5,@ManyToOne : 表示映射关系中的多对一
6,@JoinColumn : 表示外键映射属性,和表的外键字段进行关联
7,@OneToMany : 表示映射关系中的一对多,这里需要注意,一对多时,外键的维护需要翻转交给多的一方进行维护,需要配置反转属性mappedBy,属性取值为多的一方的映射属性名称。相当于xml配置文件中的Inverse="true"。
8,@OrderBy : 表示排序字段
9,@Transient : 表示声明瞬时属性,不和数据库的字段发生关联,也就是没有表中列与之映射。